Docker
是一个现代化的容器技术,使用它我们可以轻松的将应用进行打包,然后移植到其他系统,不必要在不同设备上反复配置对应的环境。
下面介绍一下基本使用:
从一个Hello world开始
Docker 可以允许你在容器中运行应用程序,使用docker run
可以在容器中运行一个应用程序。
docker run ubuntu:18.04 /bin/echo "Hello world"
run
: 表示运行一个容器ubuntu:18.04
: 指定要运行的镜像,Docker 首先在本地主机上查找对应的镜像是否存在,如果不存在的话,那么会从远程镜像仓库Docker Hub
中下载公共镜像,如果没有指定后面的 TAG,那么默认情况下使用的是 latest/bin/echo "Hello world"
: 在启动的容器中执行的命令
运行完上面的命令之后,我们会下载一个ubuntu
镜像,并且创建一个容器,使用下面的命令可以查看所有的镜像文件
docker images
如果我们不需要这些容器了,我们可以使用下面命令进行删除
# container 指的是容器的ID或者NAME,可以一次性删除多个
docker rm container [container...]
运行交互式容器
docker run -i -t ubuntu:18.04 /bin/bash
# -i -t 可以合并为-it
-t
: 在新容器中指令一个伪终端或终端-i:
允许对容器中的标准输入(stdin)进行交互
输入exit
可以退出当前容器
运行后台模式容器
使用下面的命令可以创建一个以进程方式运行的容器
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
运行完上面的命令之后会输出一串字符串,表示的是这个容器ID
容器使用
获取镜像
如果本地没有镜像,那么可以使用下面的命令获取ubuntu
镜像
docker pull ubuntu
启动容器
使用下面命令启动一个容器,并且以命令行模式进入该容器
docker run -it ubuntu /bin/bash
# 默认使用的就是 /bin/bash
使用exit
可退出终端
后台运行
在大部分的场景下,我们希望docker
的服务是在后台运行的,使用-d
参数指定容器以守护进程
的形式运行
docker run -itd --name ubuntu-test ubuntu /bin/bash
启动、停止容器
docker stop container
# 启动一个已经停止的容器
docker start container
# 重启一个容器
docker restart container
进入容器
在使用-d
参数时,容器启动会进入后台,此时如果想要进入容器,可以使用下面的指令进入
docker attach containerdocker exec container
推荐使用 docker exec,因为使用这个方式退出终端之后不会导致容器的停止
使用docker exec
的时候需要指定运行的命令,比如
docker exec -it 243c32535da7 /bin/bash
而使用 docker attach
的时候会直接进行上一次的命令
删除容器
docker rm container
删除容器的时候必须是停止状态
查看网络端口映射
# PORTS信息中有
docker ps
# 查看指定容器的端口映射
docker port container
查看容器日志
docker logs container
查看容器的进程
docker top container
检查容器
输出容器的一系列信息
docker inspect container
Docker 镜像使用
当运行容器的时候,如果使用的容器本地不存在,那么docker
会自动从镜像仓库中下载,默认是Docker Hub
公共镜像源
列出所有镜像列表
docker images
获取一个新的镜像
docker pull ubuntu:18.04
查找镜像
docker search xxx
删除镜像
镜像的删除使用 docker rmi 命令
docker rmi imageName
设置镜像标签
docker tag container xxx:xxx
Docker 容器网络连接
容器中可以运行一些网络应用,要想让外部也可以访问里面的这些应用,那么可以通过-P
或者-p
参数来指定端口映射
网络端口映射
比如说运行一个 python 应用
docker run -d -P webapp python app.py
# 将容器内容的5000(2)端口映射到宿主机的5000(1)端口
docker run -d -p 5000:5000 webapp python app.py
-P
: 容器里面的端口随机映射到主机端口-p
: 容器内部端口绑定到指定的主机端口端口进行映射之后,我们可以使用 docker ps
或者docker port container
进行查看对应的端口映射关系
默认情况下绑定的都是tcp
端口,如果要绑定udp
端口,可以再端口后面加/udp
docker run -d -p 127.0.0.1:5000:5000/udp webapp python app.py
Docker 容器互联
端口映射不是唯一的将docker
连接到另一个容器的方法docker
有一个连接系统允许将多个容器连接在一起,共享连接信息docker
连接会创建一个父子关系,其中父容器可以看到子容器的信息
端口命名
当我们创建一个容器的时候,docker 会自动对它进行命名,我们可以使用--name
参数来自定义命名
docker run -d --name ubuntu -t ubuntu:18.04 /bin/bash
# 下面方法可以修改一个container的name
docker rename container NEW_NAME
新建网络
docker network
eg:
docker network create -d bridge test-net
# -d 表示新建网络内省,有bridge, overlay
连接容器
运行一个容器并连接到新建的网络中
docker run -itd --name test1 --network test-net ubuntu /bin/bash
然后在打开一个新的终端运行一个容器并加入到 test-net 网络中
docker run -itd --name test2 --network test-net ubuntu /bin/bash
然后可以在容器之间进行 ping
ping test1 # test2内
ping test2 # test1内
Dockerfile
Dockerfile 可以用来构建一个镜像,文本内容包含了一条条构建镜像所需要的指令和说明
使用 Dockerfile 定制镜像
FROM node
COPY . /server
WORKDIR /server
RUN npm install --production
EXPOSE 3001
ENTRYPOINT [ "npm", "run", "start"]
FROM
指定使用哪一个镜像源RUN
指定要执行的命令COPY
执行相应的复制操作
docker build -t centos:6.7 DockerfilePath
-t
: 指定创建的目标镜像名DockerfilePath
: 指定需要使用的Dockerfile
文件,也可以指定所在目录,但是这样目录中的构建文件名必须是Dockerfile
构建镜像
在 Dockerfile 文件的存放目录下,执行构建动作
docker build -t nginx:v3 .
.
, 上下文路径, 可以用 Dockerfile 的路径来代替,也可以使用目录,只不过构建文件名必须为 Dockerfile
指令详解
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
--chown=
:可选参数,用户改变复制到容器内文件的拥有者和属组。
源路径
:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>
:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。 ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在 docker run
时运行。RUN 是在 docker build
。
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
ENV
设置环境变量,在后续的指令中,可以使用${}
方式引用这个环境变量。
格式:
ENV <key> <value>
// 可以一次性定义多个
ENV <key1>=<value1> <key2>=<value2>...
EXPOSE
声明端口
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
WORKDIR
指定工作目录。用 WORKDIR
指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR
指定的工作目录,必须是提前创建好的)。
docker build
构建镜像过程中的,每一个 RUN
命令都是新建的一层。只有通过 WORKDIR
创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:
USER <用户名>[:<用户组>]




