docker 容器常用操作详解
1.创建容器
# 新建并启动一个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.启动/停止容器
# 启动
$ docker container start xxx
# 终止
$ docker container stop xxx
# 查询修改
$ docker container diff xxx
3.进入容器
# 容器列表(-a 命令可以查看所有已经创建的包括终止状态的容器)
$ docker container ls -a
# 进入容器
$ docker exec -it xxx /bin/bash #xxx 为容器标识符
# 可以通过 docker container update 更新容器,例如
docker container update --restart="no" < container id>
4.导出和导入容器
# 导出容器 本地某个容器快照 使用命令 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. 删除容器
# 可以使用 docker container rm 来删除一个处于终止状态的容器, 如
$ docker container rm trusting_newton
# 如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
$ docker container prune
6. 容器的信息
# 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. 控制容器系统资源占用
docker create #命令创建容器
docker run #创建并启动容器的时候
# 可以使用:
-c|--cpu-shares[=0] # 参数来调整容器使用 CPU 的权重
-m|--memory[=MEMORY] # 参数来调整容器使用内存的大小。
8. docker 源
- Docker 官方中国区:https://registry.docker-cn.com
- 网易:http://hub-mirror.c.163.com
- 中国科技大学:https://docker.mirrors.ustc.edu.cn
- 阿里云:https://y0qd3iq.mirror.aliyuncs.com
"registry-mirrors": ["https://y0qd3iq.mirror.aliyuncs.com"]'
Docker仓库
# 登陆成功后,可以拉取账号下的全部镜像
docker login
# 退出账号
docker logout
# 搜索镜像
docker search
# 将本地的镜像推到仓库
docker push
Dockerfile常用命令
FROM
# 语法:FROM <image>:<tag>
# `FROM`:指明构建的新镜像是来自于哪个基础镜像 如果没有选择tag,那么默认为 Latest。
# 如果不以任何镜像为基础,那么 写法为:FROM scratch。scratch 镜像是一个空镜像,
# 可以用于构建 busybox 等超小镜像,可以说是真正的从零开始构建属于自己的镜像。
FROM centos:7
MAINTAINER
# 指明镜像维护者及其联系方式(一般是邮箱地址)
# 语法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL maintainer="xxx.com"
RUN 构建镜像时运行的Shell命令
# 构建镜像时运行的 Shell 命令,比如构建的新镜像中想在 /usr/local 目录下创建一个 Java 目录。
RUN mkdir -p /usr/local/java
ADD:拷贝文件或目录到镜像中, 如果是URL或压缩包,会自动下载或自动解压。
# 语法:ADD <src>... <dest>
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
COPY 拷贝文件或目录到镜像中。用法和 ADD 一样,只是不支持自动下载和解压。
# 语法:COPY <src>... <dest>
COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
WORKDIR
# 为`RUN、CMD、以及COPY , ADD`等设置默认工作目录,启动容器后会进入这个目录
Volumn
# 指定容器挂载点(共享卷), 用于容器间文件共享,某个容器修改了文件, 其他容器内的相同目录的文件也会同步更改, 要确保不同容器间有相同的目录
Expose
# 暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。
# 语法:EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80 443 8080/tcp
CMD
# :启动容器时执行的`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
# 设置容器内环境变量。
# 语法: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
:指定镜像作者
命令
# 查看容器资源占用
docker stats --no-stream
# 重启指定容器
docker restart 容器id
Docker配置文件/etc/docker/daemon.json详解
该文件作为Docker Engine的配置管理文件,几乎涵盖了所有docker命令行启动可以配置的参数。默认是没有的,需要手动创建
docker- daemon.json各配置详解
{
"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)
}
传送门
报错解决
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