Docker基本操作

#Docker 系统环境:CentOS7-1804

docker版本:18.09.6

[[Docker/Docker]]服务使用只要版本相同,命令就是一样;除非是部分系统服务控制命令,不同系统稍有偏差.

默认镜像仓库地址为docker.io,可以通过/etc/docker/daemon.json 文件来修改默认镜像仓库地址. 例如:以下操作为将docker镜像仓库地址修改为国内镜像源.

echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
systemctl restart docker

拉取镜像,通过pull拉取一个名为nginx的镜像到本地.如果不加镜像地址和版本号,默认从docker默认的仓库地址下载,镜像版本为latest

docker pull nginx

查看拉取的镜像

docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
nginx                 latest              719cd2e3ed04        2 days ago          109MB

# 按指定格式显示
docker images --format "{{.Repository}}:{{.Tag}}"
nginx:latest
ubuntu:20.04

删除镜像,通过rmi删除指定镜像,可以指定具体镜像名称:版本来删除,也可以通过IMAGE ID来删除.如果删除的镜像被某个容器所使用,则无法删除.需要先删除正在使用该镜像的容器,再删除该镜像.

dokcer rmi 719cd2e3ed04

通过镜像运行一个容器,run 表示运行, -d 在后台运行, --name 给运行的容器取一个名称, 最后面为镜像名称+版本,不指定版本则默认使用latest

查看刚才运行的容器,ps 列出本机所有正在运行的容器,-a 列出本机所有容器,包括已经停止的容器

可以用 -q 来查看正在运行的容器ID 加上-a 可以查看所有容器的ID,包括已经停止的容器

容器的控制 start | stop | restart ,启动已经停止的容器,停止正在运行的容器,重启指定容器

上面命令运行的容器无法访问,因为没有对外映射端口.如果容器需要对外提供访问,还需要映射端口, 先删除刚才创建的容器,rm 删除容器 -f 强制删除,可以指定容器名称或CONTAINER ID来进行删除

创建一个新容器,并对外映射81端口提供访问, -p(小写) 指定本地要映射的端口,81:80 :前面是本地端口, :后面是容器内的端口.以下示例为将容器内的80端口映射到本地81端口以提供对外访问. -P(大写表示不指定端口,由docker随机选择一个本机端口进行映射)

通过浏览器访问,查看服务是否可以对外访问

查看容器日志, 参数logs 显示所有日志, -f 持续显示日志内容, --tail=10 显示最后10行日志

挂载本地内容到容器内部。例如:将本地的index.html页面替换nginx默认页面。 -v 使用方法类似-p ,本地目录跟容器目录路径用:分隔,左边为本地路径,右边为容器路径。多个路径可以加多个 -v 。也可以挂载文件,将目录路径替换为文件路径即可。另外,挂载进容器的本地目录或文件会直接覆盖容器内的目录或文件。

访问页面进行测试

docker的网络模式

  • bridge模式:默认模式,容器桥接到docker0进行网络通讯

  • node模式:不进行任何网络配置,无网卡、IP、路由等

  • host模式:所有网络配置直接使用宿主机上的网络配置,例如,本机IP为1.1.1.1,如果创建一个nginx容器时指定网络模式为host,那该 容器的IP就是本机IP1.1.1.1 且不需要使用-p进行端口映射,端口自动对外暴露服务启动时的所有端口,可以通过ip+port直接访问。

  • container模式:直接使用指定容器的网络配置,一旦通过该模式连接,两个容器之间的服务可通过localhost地址访问。

以下是配置示例:

导出、导入镜像:有时部分服务器没有网络或者某些镜像未上传到镜像仓库,想在指定服务器上使用某个镜像,可以通过导出、导入的方式来复制镜像,如下示例:先用docker save命令将nginx镜像导出为tar包,然后复制到另外一台服务器上,用docker load 将tar包导入到新服务器上。因为导入镜像时一般不会导入名称和标签信息,最后用docker tag 给新导入的镜像打上标签。

将指定容器制作成镜像,有时直接修改了镜像内容,想直接将该容器生成一个新镜像以做长期使用时,可以用commit命令将指定容器制作成新镜像。

进入某个容器进行操作,一般需要在制作镜像时安装bash命令行,基于该镜像创建的容器就可以通过exec -i -t 命令进入容器进行操作

  • exec 在运行的容器中运行命令

  • -i 保持连接

  • -t 打开一个tty终端

从本地复制文件到容器中: docker [[cp命令|cp]] 容器名称:容器内部具体路径 复制到本地的路径 从容器中复制文件到本地: docker [[cp命令|cp]] 本地文件或目录路径 容器名称:容器内部具体路径 示例如下:

Docker容器的重启策略如下:

  • no,默认策略,在容器退出时不重启容器

  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器

  • on-failure:3,在容器非正常退出时重启容器,最多重启3次

  • always,在容器退出时总是重启容器

  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

Docker容器的退出状态码

docker run的退出状态码如下:

  • 0,表示正常退出

  • 非0,表示异常退出(退出状态码采用chroot标准)

  • 125,Docker守护进程本身的错误

  • 126,容器启动后,要执行的默认命令无法调用

  • 127,容器启动后,要执行的默认命令不存在

  • 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

docker run--restart选项

通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。 --restart选项通常只用于detached模式的容器。 --restart选项不能与--rm选项同时使用。显然,--restart选项适用于detached模式的容器,而--rm选项适用于foreground模式的容器。

docker ps查看容器时,对于使用了--restart选项的容器,其可能的状态只有UpRestarting两种状态。

示例:

查看容器重启次数

查看容器最后一次的启动时间

volume卷:可以用来挂载到容器中持久化数据保存,当容器删除时,volume中的数据仍会保留,除非主动删除volume

挂载本地目录和挂载volume的区别 挂载时如果指定了绝对路径,例如 /data:/container_data 则是挂载本机的目录到容器内,如果是相对路径形式,就会是以volume的形式挂载到容器内;例如: data:/container_data 如果目录或者volume卷存在则直接挂载,如果不存在,则会自动创建,本机和容器内均会自动创建。 另外如果挂载到容器内的位置有文件,本地目录挂载到容器内时,不管本地目录是否为空,都会覆盖容器内目录。volume挂载到容器时,如果volume有数据,容器内没数据,则volume覆盖容器内目录;如果volume有数据,容器内也有数据,还是volume覆盖容器内数据;如果volume为空,容器内有数据,则容器内的数据会复制到volume中,这一点挂载volume是有别于挂载本机目录的。

特权模式:容器真正的root权限

docker使用网络代理的配置

国内网络环境的原因,在有时需要拉取google相关服务的容器镜像时,会遇到无法连接的问题。可以为docker服务配置网络代理来突破网络限制,具体配置如下:

https://docs.docker.com/config/daemon/systemd/

最后更新于