Skip to content
本页目录

docker 容器常用操作详解

1.创建容器

shell
# 新建并启动一个srs镜像的容器
$ docker run -it --restart=always -p 1985:1985 -v /dev:/dev2 -v /mnt/nfs:/mnt/volume1 --name srs-service srs
--restart=always # 表示开机启用
-p 1985:1985 # 表示主机端口与docker端口的映射
-v /mnt/nfs:/mnt/volume1  # 表示本机/mnt/nfs目录挂载到容器/mnt/volume1目录
srs # 表示镜像标识符

2.启动/停止容器

shell
# 启动
$ docker container start xxx
# 终止
$ docker container stop xxx
# 查询修改
$ docker container diff xxx

3.进入容器

shell
# 容器列表(-a 命令可以查看所有已经创建的包括终止状态的容器)
$ docker container ls -a
# 进入容器
$ docker exec -it xxx /bin/bash #xxx 为容器标识符
# 可以通过 docker container update 更新容器,例如 
docker container update --restart="no" < container id>

4.导出和导入容器

shell
# 导出容器 本地某个容器快照 使用命令 docker export 
$ docker export xxx > container20201216.tar
# 导出容器 使用 docker import
$ cat container20201216.tar | docker import - srs/srs:v1.0
# 通过指定 URL 或者某个目录来导入,例如
$ docker import http://example.com/exampleimage.tgz example/imagerepo

5. 删除容器

shell
# 可以使用 docker container rm 来删除一个处于终止状态的容器, 如
$ docker container rm  trusting_newton
# 如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
$ docker container prune

6. 容器的信息

shell
# PID 信息
$ docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
# IP 地址
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
# 容器配置
$ docker inspect <CONTAINER ID or NAME>
# 容器监控
$ docker stats

已经运行的容器,可以通过 docker update 更新配置参数 <CONTAINER ID or NAME>(需要先停止容器的运行) 或者通过 /var/lib/docker/containers/容器ID 下的 hostconfig.json 等文件,修改启动配置参数

7. 控制容器系统资源占用

shell
docker create #命令创建容器
docker run #创建并启动容器的时候
# 可以使用:
 -c|--cpu-shares[=0] # 参数来调整容器使用 CPU 的权重
-m|--memory[=MEMORY] # 参数来调整容器使用内存的大小。

8. docker 源

shell
"registry-mirrors": ["https://y0qd3iq.mirror.aliyuncs.com"]'

Docker仓库

shell
# 登陆成功后,可以拉取账号下的全部镜像
docker login

# 退出账号
docker logout

# 搜索镜像
docker search

# 将本地的镜像推到仓库
docker push

Dockerfile常用命令

传送门Docker 核心知识回顾

FROM

shell
# 语法:FROM <image>:<tag>
# `FROM`:指明构建的新镜像是来自于哪个基础镜像 如果没有选择tag,那么默认为 Latest。
# 如果不以任何镜像为基础,那么 写法为:FROM scratch。scratch 镜像是一个空镜像,
# 可以用于构建 busybox 等超小镜像,可以说是真正的从零开始构建属于自己的镜像。
FROM centos:7

MAINTAINER

shell
# 指明镜像维护者及其联系方式(一般是邮箱地址)
# 语法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL maintainer="xxx.com"

RUN 构建镜像时运行的Shell命令

shell
# 构建镜像时运行的 Shell 命令,比如构建的新镜像中想在 /usr/local 目录下创建一个 Java 目录。
RUN mkdir -p /usr/local/java

ADD:拷贝文件或目录到镜像中, 如果是URL或压缩包,会自动下载或自动解压。

shell
# 语法:ADD <src>... <dest>
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

COPY 拷贝文件或目录到镜像中。用法和 ADD 一样,只是不支持自动下载和解压。

shell
# 语法:COPY <src>... <dest>
COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

WORKDIR

shell
# 为`RUN、CMD、以及COPY , ADD`等设置默认工作目录,启动容器后会进入这个目录

Volumn

shell
# 指定容器挂载点(共享卷), 用于容器间文件共享,某个容器修改了文件, 其他容器内的相同目录的文件也会同步更改, 要确保不同容器间有相同的目录

Expose

shell
# 暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。
# 语法:EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80 443 8080/tcp

CMD

shell
# :启动容器时执行的`Shell`命令, 会被`docker run` 的参数所覆盖
# 启动容器时执行的 Shell 命令,在 Dockerfile 中只能有一条 CMD 命令,如果设置了多条 CMD,只有最后一条 CMD 会生效。
# 语法:
CMD ["executable", "param1", "param2"]
# 示例:CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
CMD ["param1", "param2"]
# 示例:CMD ["echo", "$JAVA_HOME"]
CMD command param1 param2
# 示例:CMD echo $JAVA_HOME
CMD echo $JAVA_HOME

ENV

shell
# 设置容器内环境变量。
# 语法:ENV <key> <value>添加单个,ENV <key>=<value> ...添加多个。
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/

Docker image常用命令

docker build: 根据dockerfile构建一个镜像

docker images : 列出所有的镜像

docker rmi : 删除镜像

docker pull: 在主机上使用一个不存在的镜像时docker会自动下载这个镜像, 想要提前下载就使用这个命令来下载

docker run : 使用镜像生成容器并启动

  • -- privileged :使容器中的root拥有真正的root权限,否则root只是外部一个普通用户权限
  • -t: 在容器内指定一个伪终端或者终端
  • -i: 允许控制台交互
  • -d: 让容器在后台运行
  • -p: 将内部的网络端口随机映射到主机上, 也可以指定端口
  • - P : 随机端口映射,容器内部端口随机映射到主机的端口
  • --name: 命名容器, 不指定docker会自动命名
  • -h/--hostname: 设定容器的主机名, 会被写到容器内的/etc/hostname和/etc/hosts
  • -v: 挂载宿主机的一个目录 /宿主机目录:/容器目录

docker tag: 给本地镜像打标签 取消标签使用 docker rmi

docker save:将指定镜像保存成 tar 归档文件。 docker save –o export.tar imageId

docker load :用来载入镜像包

docker load –i export.tar

Docker container常用命令

docker ps: 列出正在运行的容器

docker logs: 查看容器内的标准输出

docker start 容器启动

docker stop 容器停止

docker rm /rm –f : 删除容器

docker port : 显示容器的端口

docker top: 查看容器内运行的进程

docker exec :在运行的容器中执行命令 - i 允许控制台交互 -t 在容器内指定一个伪终端或者终端

docker inspect : 查看容器的底层信息, 返回容器的配置和状态信息

docker cp:容器和宿主机之间的文件复制

下载文件 docker cp 容器ID:/home/test C://Users//Administrator//Desktop

上传文件 docker cp C://Users//Administrator//Desktop//test2 容器ID:/home

docker commit:从容器创建一个新的镜像

ocker commit containerId aaa:tag

-m : 提交的描述信息

-a:指定镜像作者

命令

shell
# 查看容器资源占用
docker stats --no-stream  
# 重启指定容器
docker restart 容器id

Docker配置文件/etc/docker/daemon.json详解

该文件作为Docker Engine的配置管理文件,几乎涵盖了所有docker命令行启动可以配置的参数。默认是没有的,需要手动创建

docker- daemon.json各配置详解

shell
{
    "allow-nondistributable-artifacts": [], #不对外分发的产品提交的registry仓库
    "api -cors-header": "" ,         #在引擎API中设置CORS标头
    "authorization - plugins":[],    #要加载的授权插件
    "bridge": "" ,           #将容器附加到网桥
    "cgroup -parent": "" ,           #为所有容器设置父cgroup
    "cluster -store": "" ,           #分布式存储后端的URL
    "cluster -store- opts":{},       #设置集群存储选项(默认map [])
    "cluster -advertise": "" ,       #要通告的地址或接口名称
    "data -root": " /var/lib/docker " ,           #Docker运行时使用的根路径,默认/var/lib/ docker
    "debug":  true ,           #启用调试模式,启用后,可以看到很多的启动信息。默认false
    "default -gateway": "" ,          #容器默认网关IPv4地址
    "default -gateway-v6": "" ,       #容器默认网关IPv6地址
    "default - runtime":"runc",       #容器的默认OCI运行时(默认为" runc")
    "default - ulimits":{},           #容器的默认ulimit(默认[])
    "dns": [],       #设定容器DNS的地址,在容器的 /etc/ resolv.conf文件中可查看。
    "dns -opts": [],                  #容器 /etc/ resolv.conf 文件,其他设置
    "dns - search": [],         #设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS不仅搜索host,还会搜索host.example.com 。 注意:如果不设置, Docker 会默认用主机上的  /etc/ resolv.conf 来配置容器。
    "exec - opts": [],          #运行时执行选项
    "exec -root": "" ,          #执行状态文件的根目录(默认为’/var/run/ docker‘)
    "fixed -cidr": "" ,         #固定IP的IPv4子网
    "fixed -cidr-v6": "" ,      #固定IP的IPv6子网
    "group": "",           #UNIX套接字的组(默认为"docker")
    "graph":"/var/lib/docker",  #已废弃,使用data-root代替,查看docker版本
    "hosts": [],           #设置容器hosts
    "icc":  false ,        #启用容器间通信(默认为true)
    "insecure-registries": [" 120.123 . 122.123 : 12312 "],           #设置私有仓库地址可以设为http
    "ip":" 0.0 . 0.0 ",    #绑定容器端口时的默认IP(默认0. 0.0 . 0 )
    "iptables":  false ,   #启用iptables规则添加(默认为true)
    "ipv6":  false ,       #启用IPv6网络
    "ip -forward":  false ,       #默认true, 启用 net.ipv4.ip_forward ,进入容器后使用 sysctl -a |  grepnet.ipv4.ip_forward 查看
    "ip -masq": false ,           #启用IP伪装(默认为true)
    "labels":["nodeName =node- 121 "],           #docker主机的标签,很实用的功能,例如定义:–label nodeName=host- 121
    "live -restore":  true ,     #在容器仍在运行时启用docker的实时还原
    "log -driver": "" ,          #容器日志的默认驱动程序(默认为" json- file ")
    "log -level": "" ,           #设置日志记录级别("调试","信息","警告","错误","致命")(默认为"信息")
    "max -concurrent-downloads": 3 ,         #设置每个请求的最大并发下载量(默认为3)
    "max -concurrent-uploads": 5 ,           #设置每次推送的最大同时上传数(默认为5)
    "mtu":  0 ,              #设置容器网络MTU
    "oom -score-adjust":- 500 ,          #设置守护程序的oom_score_adj(默认值为- 500 )
    "pidfile": "",           #Docker守护进程的PID文件
    "raw -logs":  false ,           #原始日志、全时间戳机制
    "registry -mirrors": ["https: // 192.168.2.23:89"],   #设置镜像加速地址
    "selinux -enabled":  false ,    #默认  false ,启用selinux支持
    "storage -driver": "" ,         #要使用的存储驱动程序
    "swarm -default-advertise-addr": "" ,          #设置默认地址或群集广告地址的接口
    "tls":  true ,           #默认  false , 启动TLS认证开关
    "tlscacert": "",         #默认  ~/.docker/ ca.pem,通过CA认证过的的certificate文件路径
    "tlscert": "",           #默认  ~/.docker/ cert.pem ,TLS的certificate文件路径
    "tlskey": "",            #默认 ~/.docker/ key.pem,TLS的key文件路径
    "tlsverify":true ,           #默认false,使用TLS并做后台进程与客户端通讯的验证
    "userland -proxy":false ,    #使用userland代理进行环回流量(默认为true)
    "userns -remap": "" ,        #用户名称空间的用户/ 组设置
    "bip":" 192.168 . 88.0 / 22 ",          #指定网桥IP
    "storage - opts": {
    "overlay2.override_kernel_check = true ",
    "overlay2.size = 15G"
    },         #存储驱动程序选项
    "labels":["nodeName=node-121"],        #docker主机的标签
    "live-restore": true,
    "log-driver":"",
    "log-level":"",
    "log-opts": {},
    "max-concurrent-downloads":3,
    "max-concurrent-uploads":5,
    "mtu": 0,
    "oom-score-adjust":-500,
    
    "log - opts": {
    "max - file ": " 3 ",
    "max - size": "10m",
    },         #容器默认日志驱动程序选项
    "iptables":  false          #启用iptables规则添加(默认为true)
}

传送门

常用命令

docker-compose: 未找到命令

报错解决

text
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.

## 可能点1 是由docker安装的问题导致的,最好重新安装
# 注意点:添加docker官方仓库, wheezy为debian版本号的代号,一定要写对

## 可能点2 路径/etc/docker/daemon.json文件有错误,删除掉后重启doker