Docker
- Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口
相关文档
Docker 中文文档
虚拟机 与 Docker
Docker 优势
Image/镜像
- 应用程序和配置打包形成一个镜像
- 一个镜像可以生成多个同时运行的容器实例
Container/容器
仓库
Docker logo 含义
docker
的 logo
是一只鲸鱼稳定的航行在大海中,鲸鱼背上面有很多集装箱。
dock
本意码头
docker
代表码头上的工人
大海暗指宿主机
docker
就是这条鲸鱼
鲸鱼背上的集装箱就是一个一个的容器
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #docker info docker version docker help
docker images //查看本地所有镜像 docker images -a //all 所以镜像,包括中间镜像 //docker image ls -a -q // 只显示 id docker search //查找镜像 docker pull //下载镜像 docker image rm // docker rmi -f 删除镜像 docker rmi -f ${docker images -qa} //删除全部镜像
docker run [options ] image_name/iamge_id // --name='容器名字' // -i 以交互模式运行 // -t 为容器分配一个伪输入终端 // -p 端口映射 // host_port:container_port // ip:host_port:container_port // // ip::container_port // container_port // -d 后台运行 但会立即退出 //Docker容器后台运行,就必须有一个前台进程 //退出容器 exit //停止容器退出 ctrl+P+Q //不停止容器退出 docker ps //docker container ps //查看正在运行 容器 //-a 历史上运行过的 docker ps -l //上次运行过的 // -n 3 上3次运行过的 docker start //docker container start/stop/restart docker kill //强制关闭容器 docker rm //docker container rm
//删除全部容器 docker rm -rf $(docker ps -aq) //docker ps -aq | xargs docker rm
//日志 docker logs -ft --tial id
//查看容器内运行的进行 docker top id
//查看容器的信息//配置等 docker inspect id
//进行正在运行的容器//在宿主机外面对容器执行命令 docker exec -it id command //docker exec -it id /usr/bin/bash 此时exit不会停止容器
docker attach id //进入容器
//从容器copy文件到宿主机 docker cp id:/path/file /path/file
//容器-->镜像 docker commit -m="msg" -a="author" id 镜像:[target] //docker commit -m="这是基于hello world 容器更改后的新镜像" -a="daixiongsheng" fea2sdae54245 My_hello_world:latest
|
详解 Docker 镜像
docker 镜像是由一层一层文件系统组成 UnionFS
,包括 bootfs boot file system
和 rootfs root file system
bootfs 主要包含系统的 bootloader 和内核 ,rootfs 主要包含 mini Linux 系统中的标准目录和文件
pull 一个 Hello world 镜像可能只有几 M,一个 CentOS 也就 200+M,但一个 Tomcat 需要 4、500+M
这是因为 hello world 只需要标准的输出控制,而 CentOS、Ubuntu 等都是基于 Linux 的,所以他们相应的镜像中某些功能就可以借助宿主机(比如内核等),而 Tomcat 不仅需要 Linux 内核,还需要 Java 运行环境(jdk..)所以相对前两者比较大,我们在 pull 一个镜像的时候可以看到下载的不只一个镜像,但最后暴露给用户使用的只能我们需要的那一两个。这种分层镜像就可以共享资源
容器数据卷
- 将运行产生的数据持久化
- 数据共享(宿主机到容器..)
1 2 3 4
| docker run -it -v /宿主机目录:/容器目录 镜像名 # --privileged=true # 容器停止后,主机仍可修改,待容器重新启动,数据会自己同步 # docker run -it -v /宿主机目录:/容器目录:ro 镜像名 #readonly
|
1 2 3 4 5
| //容器B继承容器A的卷
docker run --name=A centos docker run --name=B --volumes-from A centos
|
Dockerfile
- 和
Makefile
类似 Docker
镜像的构建文件- 每条指令都会创建一个新的镜像层,并对镜像进行提交
- 指令结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| FROM #基于哪个镜像 scratch是最基的镜像,类似js里面的Object类 MAINTAINTER #镜像维护的作者的email RUN #构建时需要执行的命令 EXPOSE #暴露端口 WORKDIR #终端登陆进来的工作目录 ENV #设置环境变量 ENV MY_PATH /data ADD #copy并解压缩到指定目录,也可处理url COPY #复制 VOLUME #容器卷 VALUME["/dir1","/dir2"] 容器内的卷,主机上docker 会产相应的默认目录 CMD #容器启动运行的命令,有多个命令时,只有最后一个会生效,CMD会在docker run 之后的参数替换 # docker ENTRYPOINT #容器启动运行的命令,和CMD一样,会追加,多个ENTRYPOINT都会执行, #如果Dockrfile 最后一行是 ENTRYPOINT docker run 的参数会叠加给最后的ENTRYPOINT进行组合 # ONBUILD #子镜像继承后运行时会触发
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| FROM openjdk:8-jdk
ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" WORKDIR $CATALINA_HOME
... ... ...
RUN set -e \ && nativeLines="$(catalina.sh configtest 2>&1)" \ && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \ && nativeLines="$(echo "$nativeLines" | sort -u)" \ && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \ echo >&2 "$nativeLines"; \ exit 1; \ fi
EXPOSE 8080 CMD ["catalina.sh", "run"]
|
1
| docker build -f dockerfile -t author/app .
|
发布镜像
- 镜像来源* Dockerfile-->build
- aliyun 创建仓库
1 2 3
| docker login --username=username [仓库地址] docker tag [ImageId] [公网/专有地址]:[镜像版本号] docker push [公网/专有地址]:[镜像版本号]
|
Docker 关系