Docker 基本使用

Docker 是一个现代化的容器技术,使用它我们可以轻松的将应用进行打包,然后移植到其他系统,不必要在不同设备上反复配置对应的环境。

下面介绍一下基本使用:

从一个Hello world开始

Docker 可以允许你在容器中运行应用程序,使用 docker run 可以在容器中运行一个应用程序。

1
docker run ubuntu:18.04 /bin/echo "Hello world"
  • run: 表示运行一个容器
  • ubuntu:18.04: 指定要运行的镜像,Docker 首先在本地主机上查找对应的镜像是否存在,如果不存在的话,那么会从远程镜像仓库 Docker Hub 中下载公共镜像,如果没有指定后面的 TAG,那么默认情况下使用的是 latest
  • /bin/echo "Hello world": 在启动的容器中执行的命令

运行完上面的命令之后,我们会下载一个 ubuntu 镜像,并且创建一个容器,使用下面的命令可以查看所有的镜像文件

1
docker images

如果我们不需要这些容器了,我们可以使用下面命令进行删除

1
2
# container 指的是容器的ID或者NAME,可以一次性删除多个
docker rm container [container...]

运行交互式容器

1
2
docker run -i -t ubuntu:18.04 /bin/bash
# -i -t 可以合并为-it
  • -t: 在新容器中指令一个伪终端或终端
  • -i: 允许对容器中的标准输入(stdin)进行交互

输入exit可以退出当前容器

运行后台模式容器

使用下面的命令可以创建一个以进程方式运行的容器

1
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

运行完上面的命令之后会输出一串字符串,表示的是这个 容器ID

容器使用

获取镜像

如果本地没有镜像,那么可以使用下面的命令获取 ubuntu 镜像

1
docker pull ubuntu

启动容器

使用下面命令启动一个容器,并且以命令行模式进入该容器

1
2
docker run -it ubuntu /bin/bash
# 默认使用的就是 /bin/bash

使用 exit 可退出终端

后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,使用 -d 参数指定容器以 守护进程 的形式运行

1
docker run -itd --name ubuntu-test ubuntu /bin/bash

启动、停止容器

1
2
3
4
5
docker stop container
# 启动一个已经停止的容器
docker start container
# 重启一个容器
docker restart container

进入容器

在使用 -d 参数时,容器启动会进入后台,此时如果想要进入容器,可以使用下面的指令进入

  • docker attach container
  • docker exec container

    推荐使用 docker exec,因为使用这个方式退出终端之后不会导致容器的停止

使用 docker exec 的时候需要指定运行的命令,比如

1
docker exec -it 243c32535da7 /bin/bash

而使用 docker attach 的时候会直接进行上一次的命令

删除容器

1
docker rm container

删除容器的时候必须是停止状态

查看网络端口映射

1
2
3
4
5
# PORTS信息中有
docker ps

# 查看指定容器的端口映射
docker port container

查看容器日志

1
docker logs container

查看容器的进程

1
docker top container

检查容器

输出容器的一系列信息

1
docker inspect container

Docker 镜像使用

当运行容器的时候,如果使用的容器本地不存在,那么 docker 会自动从镜像仓库中下载,默认是 Docker Hub 公共镜像源

列出所有镜像列表

1
docker images

获取一个新的镜像

1
docker pull ubuntu:18.04

查找镜像

1
docker search xxx

删除镜像

镜像的删除使用 docker rmi 命令

1
docker rmi imageName

设置镜像标签

1
docker tag container xxx:xxx

Docker 容器网络连接

容器中可以运行一些网络应用,要想让外部也可以访问里面的这些应用,那么可以通过 -P 或者 -p 参数来指定端口映射

网络端口映射

比如说运行一个 python 应用

1
2
3
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

1
docker run -d -p 127.0.0.1:5000:5000/udp webapp python app.py

Docker 容器互联

端口映射不是唯一的将 docker 连接到另一个容器的方法
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息

端口命名

当我们创建一个容器的时候,docker 会自动对它进行命名,我们可以使用 --name 参数来自定义命名

1
2
3
docker run -d --name ubuntu -t ubuntu:18.04 /bin/bash
# 下面方法可以修改一个container的name
docker rename container NEW_NAME

新建网络

1
docker network

eg:

1
2
docker network create -d bridge test-net
# -d 表示新建网络内省,有bridge, overlay

连接容器

运行一个容器并连接到新建的网络中

1
docker run -itd --name test1 --network test-net ubuntu /bin/bash

然后在打开一个新的终端运行一个容器并加入到 test-net 网络中

1
docker run -itd --name test2 --network test-net ubuntu /bin/bash

然后可以在容器之间进行 ping

1
2
ping test1  # test2内
ping test2 # test1内

Dockerfile

Dockerfile 可以用来构建一个镜像,文本内容包含了一条条构建镜像所需要的指令和说明

使用 Dockerfile 定制镜像

1
2
3
4
5
6
7
FROM node
COPY . /server
WORKDIR /server
RUN npm install --production

EXPOSE 3001
ENTRYPOINT [ "npm", "run", "start"]

FROM 指定使用哪一个镜像源
RUN 指定要执行的命令
COPY 执行相应的复制操作

1
docker build -t centos:6.7 DockerfilePath
  • -t: 指定创建的目标镜像名
  • DockerfilePath: 指定需要使用的 Dockerfile 文件,也可以指定所在目录,但是这样目录中的构建文件名必须是 Dockerfile

构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作

1
docker build -t nginx:v3 .

., 上下文路径, 可以用 Dockerfile 的路径来代替,也可以使用目录,只不过构建文件名必须为 Dockerfile

指令详解

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

格式:

1
2
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

--chown=:可选参数,用户改变复制到容器内文件的拥有者和属组。

源路径:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

1
2
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
1
2
3
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

1
2
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

EXPOSE

声明端口

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:

1
EXPOSE <端口1> [<端口2>...]

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

格式:

1
WORKDIR <工作目录路径>

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式:

1
USER <用户名>[:<用户组>]

生活杂笔,学习杂记,偶尔随便写写东西。

作者

Edgar

发布于

2021-07-10

更新于

2021-12-21

许可协议

评论