介绍docker架构及三个基本概念:镜像、容器和仓库。介绍镜像和容器的基本操作;从官方仓库拉取镜像(再创建自己的镜像)。
Docker Client 客户端通过命令行或者其他工具使用 Docker SDK 与Docker守护进程通信。
Docker Host 主机是一个物理的或虚拟的机器,用于运行docker容器或守护进程,主机中有本地镜像。
Docker Registry会有多个仓库,每个仓库都,每个仓库可以包含多个标签,每个标签对应一个镜像。
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
从镜像仓库中拉取或者更新指定镜像。
(1)语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
(2)实例
从Docker Hub下载java最新版镜像。
docker pull ubuntu
从Docker Hub下载ubuntu 18.04镜像
docker pull ubuntu:18.04
删除本地仓库的镜像
创建一个新的容器并运行一个命令,语法如下
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常见的选项
几个例子如下:
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
使用镜像ubuntu以交互模式启动一个容器,将主机的80端口映射到容器8080端口,并在容器内执行/bin/bash命令。
docker run -p 80:8080 –it ubuntu bash
以后台服务运行,成功后返回容器id
docker run -itd --name ubuntu-test ubuntu /bin/bash
列出容器列表,默认docker ps输出运行中的容器。如法如下
docker ps [OPTIONS]
常见选项有
输出容器信息的常见的字段有CONTAINER ID、IMAGE、COMMAND、CREATED、STATUS、PORTS、NAMES等。
在使用-d参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker exec -it 243c32535da7 /bin/bash
当使用exit从容器退出时,不会导致容器的退出。
这里要求容器是存在的。
选项-s :向容器发送一个信号,例如杀掉运行中的容器mynginx
$ docker kill -s KILL mynginx
删除一个不再需要的容器,这个容器必须是停止状态的。
查看停止状态的容器可以命令 docker ps -f status=exited
。
主要是自己定制镜像。
Dockerfile 是一个用在来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。使用docker build命令根据Dockerfile创建镜像,命令语法为
docker build [OPTIONS] PATH | URL | -
选项较多,使用help命令查询。
例如,当前目录下创建一个Dockerfile文件,内容为
FROM ubuntu:18.04
COPY ./test_docker_1 /app/
拉取镜像ubuntu:18.04,并将当前目录的test_docker_1复制到镜像的/app/目录下。执行命令创建Dockerfile的目录。
docker build -t ubuntu:test_app .
当我们使用该镜像启动容器,交互模式下使用命令就可以执行该程序。
(1)FROM 和 RUN
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>
#<命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
例如:
RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以 &&
符号连接命令,这样执行后,只会创建 1 层镜像。
(1)COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。注意,目录需要带斜杠。
(2)ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
(3)CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","" ,"" ,...]
CMD ["" ,"" ,...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
在docker 容器中构建好自己需要的环境,再导出为image镜像。当前操作起始做的就是dockerfile的事情。
延续4.1中定制的镜像。首先直接使用官方的镜像ubuntu:18.04启动容器,进入容器并创建/app目录并复制test_docker_1文件,此时运行的容器完全同4.1从Dockerfile创建的镜像启动的容器。
使用容器导出和导入命令生成定制的镜像
$ docker export 10da36c7ee3f | docker import - ubuntu:test_app2