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 | # container 指的是容器的ID或者NAME,可以一次性删除多个 |
运行交互式容器
1 | docker run -i -t ubuntu:18.04 /bin/bash |
-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 | docker run -it ubuntu /bin/bash |
使用 exit
可退出终端
后台运行
在大部分的场景下,我们希望 docker
的服务是在后台运行的,使用 -d
参数指定容器以 守护进程
的形式运行
1 | docker run -itd --name ubuntu-test ubuntu /bin/bash |
启动、停止容器
1 | docker stop 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 | # PORTS信息中有 |
查看容器日志
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 | docker run -d -P 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 | docker run -d --name ubuntu -t ubuntu:18.04 /bin/bash |
新建网络
1 | docker network |
eg:
1 | docker network create -d bridge test-net |
连接容器
运行一个容器并连接到新建的网络中
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 | ping test1 # test2内 |
Dockerfile
Dockerfile 可以用来构建一个镜像,文本内容包含了一条条构建镜像所需要的指令和说明
使用 Dockerfile 定制镜像
1 | FROM node |
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 | COPY [--chown=<user>:<group>] <源路径1>... <目标路径> |
--chown=
:可选参数,用户改变复制到容器内文件的拥有者和属组。
源路径
:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
1 | COPY hom* /mydir/ |
<目标路径>
:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在
docker run
时运行。 - RUN 是在
docker build
。
1 | CMD <shell 命令> |
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
1 | ENV <key> <value> |
EXPOSE
声明端口
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
1 | EXPOSE <端口1> [<端口2>...] |
WORKDIR
指定工作目录。用 WORKDIR
指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR
指定的工作目录,必须是提前创建好的)。
docker build
构建镜像过程中的,每一个 RUN
命令都是新建的一层。只有通过 WORKDIR
创建的目录才会一直存在。
格式:
1 | WORKDIR <工作目录路径> |
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:
1 | USER <用户名>[:<用户组>] |
生活杂笔,学习杂记,偶尔随便写写东西。