Docker简介:Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。Docker分为CE和EE两大版本。CE即社区版,免费使用,EE即企业版,强调安全,付费使用。Docker Engine分为stable
、test
和nightly
三种类型的更新通道。
下面就总结一下Docker在linux CentOs7 64位系统上的安装及常用命令。
一、Docker的安装
1.卸载旧版本Docker
旧版本的Docker一般称为docker或 docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。查询安装过的Docker包:
yum list installed | grep docker
查询结果:
[root@iZwz94v2sdd3v6zcczsu67Z local]# yum list installed | grep docker
containerd.io.x86_64 1.2.10-3.2.el7 @docker-ce-stable
docker-ce.x86_64 3:19.03.3-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:19.03.5-3.el7 @docker-ce-stable
删除安装包:
yum remove docker-ce.x86_64 docker-ce-cli.x86_64
删除所有镜像、容器和数据卷:
rm -rf /var/lib/docker
2.查看系统内核版本
Docker要求CentOS系统的内核版本不低于3.10,查看CentOS内核版本命令:
uname -r
系统内核版本如下:
[root@iZwz94v2sdd3v6zcczsu67Z local]# uname -r
3.10.0-957.21.3.el7.x86_64
3.更新yum包
将yum包更新到最新:
sudo yum update
4.安装需要的软件包
安装需要的软件包,yum-util提供yum-config-manager、device-mapper-persistent-data和lvm2是devicemapper驱动需要的,命令如下:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5.设置repository
设置stable
的repository的Docker官方yum源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
设置stable
的repository的Docker阿里云yum源:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
推荐使用阿里云的Docker yum源。下面是可选操作,night
和test
的repository包含在上面的docker.repo
文件中,默认处于禁用状态,使用的是stable
的repository。如果需要每日构建版本的Docker CE则使用以下命令启用night
的repository:
sudo yum-config-manager --enable docker-ce-nightly
如果需要测试版本的Docker CE则使用以下命令启用test
的repository:
sudo yum-config-manager --enable docker-ce-test
通过运行带有--disable
和--enable
选项的yum-config-manager
可以禁用和启用night
和test
的repository。以下为禁用night
的repository的命令:
sudo yum-config-manager --disable docker-ce-nightly
6.查看仓库中所有Docker版本
这里安装Docker CE,在安装之前可以查看一下仓库中所有Docker CE版本,选择一个特定版本安装,命令如下:
yum list docker-ce --showduplicates | sort -r
此处列举出仓库中所有版本Docker列表的一部分:
[root@iZwz94v2sdd3v6zcczsu67Z local]# yum list docker-ce --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
Docker1.13版本之后,版本命名格式变更为YY.MM,YY为年,MM为月。
7.安装Docker
若要安装指定版本如19.03.3版本的Docker CE,安装命令如下:
sudo yum install docker-ce-19.03.3
若要安装最新版本的Docker CE,则无需加版本号,命令如下:
sudo yum install docker-ce
这里选择安装最新版本的Docker CE,Docker安装后尚未启动,创建了docker
用户组,但没有用户添加到该组。
注意:如果启动了多个Docker的repositorie,且未在
yum install
或yum update
命令中指定版本的情况下进行安装或更新将始终安装可能的最高版本,这可能不适合稳定性需求。
下面是补充说明。
在19.03版本的Docker Engine中,客户端和容器运行时(container runtime)与Docker Engine 18.09中的守护程进程(daemon)位于不同的软件包中。应同时安装和更新所有三个软件包,以获取最新的修补程序版本。例如在CentOS上:
sudo yum install docker-ce docker-ce-cli containerd.io
。
安装指定版本的Docker CE和containerd.io使用以下命令:
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
安装最新版本的Docker CE和containerd.io使用以下命令:
sudo yum install docker-ce docker-ce-cli containerd.io
8.启动Docker并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
9.加入docker用户组
如果使用的是root
用户可以跳过此步骤。如果使用的是非root用户,由于Docker守护进程(daemon)绑定到Unix socket而不是TCP端口,默认情况下只有root
用户才可以访问Unix socket而其他非root用户只能通过在Docker命令前使用sudo
来访问Unix socket。如果不想在Docker命令前使用sudo
,可以创建一个名为docker
的UNIX组并将用户加入该组。Docker守护进程启动时,它会创建一个可由该docker
组成员访问的Unix socket。
警告:该
docker
用户组会授予与root
用户等效的特权。
创建docker
组,一般在安装Docker的过程中会自动创建。命令如下:
sudo groupadd docker
将当前用户加入docker
组:
sudo usermod -aG docker $USER
注销并重新登录后生效。如果在虚拟机上进行测试,可能需要重新启动虚拟机使更改生效。在Linux上还可以运行以下命令来激活对组的更改:
newgrp docker
如果在将用户加入到docker
组之前使用sudo
运行Docker命令出现以下错误:
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
这说明由于sudo命令,造成~/.docker/
目录创建时使用的权限不正确。要解决此问题,可以删除~/.docker/
目录,删除后会自动重新创建该目录,但是所有自定义设置都会丢失,或者使用以下命令更改其所有权和权限:
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R
10.验证安装是否成功
命令如下:
docker version
docker -v
以下是结果,有Client和Server表示Docker的安装启动都成功。
[root@iZwz94v2sdd3v6zcczsu67Z local]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:24:18 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.10
GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
Version: 1.0.0-rc8+dev
GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
Version: 0.18.0
GitCommit: fec3683
[root@iZwz94v2sdd3v6zcczsu67Z local]# docker -v
Docker version 19.03.5, build 633a0ea
11.查看Docker启动状态
systemctl status docker
以下是结果,Active: active (running)
表示启动成功,Docker正在运行状态。
[root@iZwz94v2sdd3v6zcczsu67Z local]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2020-01-10 14:42:08 CST; 5min ago
Docs: https://docs.docker.com
Main PID: 20599 (dockerd)
CGroup: /system.slice/docker.service
└─20599 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
12.Docker设置国内镜像源
Docker中国区官方镜像源:https://registry.docker-cn.com
网易镜像源:http://hub-mirror.c.163.com
中国科技大学镜像源:https://docker.mirrors.ustc.edu.cn
阿里云镜像源:点击https://cr.console.aliyun.com/
进入阿里云控制台,找到容器镜像服务,点击镜像加速器获取个人专属镜像加速地址。
然后设置Docker国内镜像源,这里设置的是阿里云的镜像源。
vi /etc/docker/daemon.json
写入如下内容:
{
"registry-mirrors": ["https://个人阿里云加速.mirror.aliyuncs.com"]
}
重新加载配置,重启Docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
在重启Docker服务时如果出现了以下错误,请仔细检查daemon.json
内容是否有误。
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
13.软件包安装和脚本安装
下面补充软件包手动安装和脚本快捷安装两种安装方式。首先是使用软件包安装,打开https://download.docker.com/linux/centos/,选择CentOs版本,这里选择7,然后进入x86_64/stable/Packages/
下载指定版本的Docker CE安装。如果要安装night
或test
更新通道的Docker CE,将x86_64/stable/Packages/
的stable
替换为night
或test
即可。然后安装Docker Engine,执行以下命令,路径改为Docker软件包的路径:
sudo yum install /path/to/package.rpm
启动并加入开机启动:
sudo systemctl start docker
sudo systemctl enable docker
下面是通过脚本快捷安装。在测试或开发环境中,Docker官方为了简化安装流程,在get.docker.com 和test.docker.com上提供了便捷的安装脚本用来安装,另外可以通过--mirror
选项使用国内源进行安装。执行以下命令安装最新版本的Docker CE:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
如果要安装最新的test
版本,则需改用test.docker.com
。用test
代替上面命令中的get
:
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh --mirror Aliyun
不建议在生产环境中使用这些脚本。
二、Docker常用命令
这里只总结一些常用的Docker命令,更详细的命令可以参考Docker Command 官方。
1.Docker基本操作
(1)启动docker
systemctl start docker
(2)停止docker
systemctl stop docker
(3)重启docker
systemctl restart docker
(4)查看docker启动状态
systemctl status docker
(5)查看概要信息
docker info
(6)查看help文档
docker --help
2.镜像仓库
(1)登入镜像仓库
登入一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库Docker Hub。
格式
docker login [OPTIONS] [SERVER]
选项
--password,-p 密码
--password-stdin 从标准输入中获取密码
--username,-u 用户名
(2)登出镜像仓库
登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库Docker Hub。
格式
docker logout [SERVER]
(3)搜索镜像
格式
docker search [OPTIONS] TERM
选项
--automated 只列出automated build类型的镜像
--filter,-f 显示满足条件的镜像
--format 指定返回值的模板文件
--limit 搜索结果最大显示数,默认值25
--no-trunc 显示完整的镜像信息
--stars,-s 列出收藏数不小于指定值的镜像
示例
搜索redis镜像,最多显示3条结果:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker search --limit=3 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 7710 [OK]
bitnami/redis Bitnami Redis Docker Image 137 [OK]
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 32 [OK]
搜索满足条件的mysql镜像,按指定模板格式并显示完整的镜像信息:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker search --filter "is-official=true" --filter "stars=4000" --format "table {{.Name}}\t{{.IsAutomated}}\t{{.IsOfficial}}\t{{.Description}}\t{{.StarCount}}" --no-trunc mysql
NAME AUTOMATED OFFICIAL DESCRIPTION STARS
mysql [OK] MySQL is a widely used, open-source relational database management system (RDBMS). 9015
(4)拉取镜像
格式
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
选项
--all-tags,-a 拉取所有tagged镜像
--disable-content-trust 跳过镜像校验,默认值为true
--platform 如果server支持多平台可以设置平台
--quiet,-q 压缩冗长的输出
示例
拉取mysql:8.0.16
镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker pull mysql:8.0.16
8.0.16: Pulling from library/mysql
0a4690c5d889: Pull complete
98aa2fc6cbeb: Pull complete
0777e6eb0e6f: Pull complete
2464189c041c: Pull complete
....
Digest: sha256:5d11283aee9b73509b737785e0ad79a2d9abf51f4abf3f221702a8add0e36bf2
Status: Downloaded newer image for mysql:8.0.16
docker.io/library/mysql:8.0.16
(5)上传镜像或仓库
格式
docker push [OPTIONS] NAME[:TAG]
选项
--disable-content-trust 跳过镜像的校验,默认值为true
示例
docker pull 192.168.161.128:5000/nginx-gta
3.镜像管理
(1)显示本地镜像列表
格式
docker images [OPTIONS] [REPOSITORY[:TAG]]
选项
--all,-a 列出所有镜像(默认隐藏中间镜像)
--digests 显示镜像的摘要信息
--filter,-f 显示满足条件的镜像
--format 指定返回值的模板文件
--no-trunc 显示完整的镜像信息
--quiet,-q 只显示镜像ID
示例
列出所有镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c7460dfcab50 34 hours ago 126MB
redis latest 9b188f5fb1e6 8 days ago 98.2MB
ubuntu latest 549b9b86cb8d 3 weeks ago 64.2MB
centos 7 5e35e350aded 2 months ago 203MB
mysql 8.0.16 de764ad211de 5 months ago 443MB
tomcat 9-jre8 e24825d32965 8 months ago 464MB
registry latest f32a97de94e1 10 months ago 25.8MB
java 8 d23bdf5b1b1b 2 years ago 643MB
java latest d23bdf5b1b1b 2 years ago 643MB
java 7 5dc48a6b75af 2 years ago 584MB
ubuntu 15.10 9b9cb95443b5 3 years ago 137MB
按指定模板格式列出所有java镜像并显示完整的镜像信息和镜像摘要信息:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" --no-trunc --digests java
IMAGE ID REPOSITORY TAG SIZE DIGEST
sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8 java 8 643MB sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8 java latest 643MB sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
sha256:5dc48a6b75af4b1a9464caad2aecb3a13593a9a525926bcc0c4df60887bb2332 java 7 584MB sha256:c0b61b62639124aa838dc755c5a9d57c072f762b71b170281927399a14db4652
(2)设置镜像标签
格式
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
示例
将镜像ubuntu:15.10
标记为runoob/ubuntu:v3
镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker tag ubuntu:15.10 runoob/ubuntu:v3
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images runoob/ubuntu:v3
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v3 9b9cb95443b5 3 years ago 137MB
(3)查看镜像历史
格式
docker history [OPTIONS] IMAGE
选项
--format 指定返回值的模板文件
--human,-H 以可读的格式打印镜像大小和日期,默认值为true
--no-trunc 显示完整的记录
--quiet,-q 只显示镜像id
示例
查看runoob/ubuntu:v3
的创建历史,只显示镜像id:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker history runoob/ubuntu:v3 -q
9b9cb95443b5
<missing>
<missing>
<missing>
<missing>
(4)导出镜像
将镜像保存至tar文件中,未指定tar时默认保存为标准输出,主要用于备份镜像。
格式
docker save [OPTIONS] IMAGE [IMAGE...]
选项
--output,-o 输出保存到的文件名称
示例
将java:7
和java:8
打包成myjava.tar
文件:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker save -o myjava.tar java:7 java:8
[root@iZwz94v2sdd3v6zcczsu67Z ~]# ls
10 myjava.tar
(5)加载镜像
从tar文件或者标准输入中载入镜像,主要用于恢复镜像。
格式
docker load [OPTIONS]
选项
--input,-i 指定导入的文件名称,代替STDIN
--quiet,-q 精简输出信息
示例
从myjava.tar
文件中加载镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker load -i myjava.tar -q
Loaded image: java:7
Loaded image: java:8
(6)导入镜像
从导出的tar文件中导入创建镜像。
格式
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
选项
--change,-c 应用Dockerfile命令创建镜像
--message,-m 设置导入镜像的提交信息
--platform 如果server支持多平台可以设置平台
示例
基于镜像导出myjava.tar
导入创建新镜像myjava:v1
:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker import myjava.tar myjava:v1 -m xxx
sha256:95a4857ebe4af7643878be633d5bd5fce53637fa585a5a70975afbb5c82cde47
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images myjava:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
myjava v1 95a4857ebe4a 20 seconds ago 958MB
(7)基于Dockerfile构建镜像
格式
docker build [OPTIONS] PATH | URL | -
选项
--add-host 添加自定义主机名到IP的映射(host:ip)
--build-arg 设置镜像创建时的变量
--cache-from 使用指定镜像作为缓存源
--cgroup-parent 继承自上层的cgroup
--compress 构建上下文时使用gzip压缩
--cpu-period 限制CPU CFS(Completely Fair Scheduler)周期
--cpu-quota 限制CPU CFS(Completely Fair Scheduler)配额
--cpu-shares,-c CPU的使用权重
--cpuset-cpus 指定使用的cpu id
--cpuset-mems 指定使用的内存 id
--disable-content-trust 跳过镜像验证,默认值为true
--file,-f 指定要使用的Dockerfile的名称(默认为‘PATH/Dockerfile’)
--force-rm 总是删除中间容器
--iidfile 将镜像id写进一个文件
--isolation 使用容器隔离技术
--label 设置镜像元数据
--memory,-m 最大内存
--memory-swap 设置Swap的最大值等于内存加swap,'-1'表示不限制swap
--network 在构建期间设置RUN指令的网络模式
--no-cache 构建镜像过程中不使用缓存
--output,-o 输出到的目的地(format: type=local,dest=path)
--platform 如果server支持多平台可以设置平台
--progress 设置进度输出类型(auto,plain,tty),默认值为auto
--pull 总是尝试拉取一个新版本镜像
--quiet,-q 压缩构建输出并且成功只打印镜像id
--rm 构建镜像成功后删除中间容器,默认值为true
--secret 私密文件公开构建(仅当启用了BuildKit时):id=mysecret,src=/local/secret
--security-opt 安全设置
--shm-size 设置/dev/shm的大小
--squash 将新创建的多层挤压放入到一层中
--ssh SSH代理套接字或密钥公开构建(仅当启用了BuildKit时)(格式:default|[=|[,]])
--stream 以流形式持续获取创建的上下文
--tag,-t 镜像的名字及标签,通常为'name:tag'格式
--target 设置创建的目标阶段
--ulimit Ulimit配置
示例
使用当前目录的Dockerfile
创建镜像:
docker build -t vieux/apache:2.0 .
使用URL
创建镜像:
docker build github.com/creack/docker-firefox
通过指定Dockerfile
文件的位置创建镜像:
docker build -f /ctx/Dockerfile .
(8)删除镜像
格式
docker rmi [OPTIONS] IMAGE [IMAGE...]
选项
--force,-f 强制删除
--no-prune 不移除该镜像的过程镜像
示例
强制删除runoob/ubuntu:v3
镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker rmi -f runoob/ubuntu:v3
Untagged: runoob/ubuntu:v3
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images runoob/ubuntu:v3
REPOSITORY TAG IMAGE ID CREATED SIZE
也可以通过镜像id删除:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images myjava:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
myjava v1 95a4857ebe4a 22 minutes ago 958MB
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker rmi -f 95a4857ebe4a
Untagged: myjava:v1
Deleted: sha256:95a4857ebe4af7643878be633d5bd5fce53637fa585a5a70975afbb5c82cde47
Deleted: sha256:36df6d98e015fff78e4b3ad7f646db44860d4468298b19938b303367d76106d5
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images myjava:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
删除所有镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker rmi `docker images -q`
4.容器生命周期管理
(1)创建容器并运行
格式
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
选项
只列出部分常用选项。
--attach,-a 指定标准输入输出内容类型,可选STDIN,STDOUT,STDERR三项
--cap-add 添加权限
--cap-drop 删除权限
--cidfile 向指定文件中写入容器id
--cpu-count CPU总数(Windows only)
--cpu-percent CPU百分比(Windows only)
--cpu-period 限制CPU CFS(Completely Fair Scheduler)周期
--cpu-quota 限制CPU CFS(Completely Fair Scheduler)配额
--cpu-shares,-c CPU的使用权重
--cpus CPU数
--cpuset-cpus 指定使用的cpu id
--cpuset-mems 指定使用的内存 id
--detach,-d 后台运行容器并打印容器ID
--device 添加主机设备给容器
--dns 指定容器的dns服务器
--dns-search 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf
--entrypoint 覆盖镜像的入口点
--env,-e 设置环境变量
--env-file 指定读入环境变量的文件
--expose 指定容器暴露的端口
--hostname,-h 指定容器的主机名
--interactive,-i 即使未连接STDTN标准输入也保持STDIN为打开状态,通常与-t同时使用
--ip IPv4地址(e.g., 172.30.100.104)
--ip6 IPv6地址(e.g., 2001:db8::33)
--isolation 使用容器隔离技术
--label,-l 设置容器元数据
--link 添加链接到另一个容器
--memory,-m 容器使用内存最大值
--name 指定容器名称
--net 容器网络设置
--platform 如果server支持多平台可以设置平台
--privileged 指定容器是否为特权容器
--publish,-p 指定端口映射,主机(宿主)端口:容器端口
--publish-all,-P 随机端口映射,容器内部端口随机映射到主机的高端口
--restart 指定容器停止后的重启策略,默认值为no
--rm 退出容器后自动删除容器
--security-opt 安全设置
--shm-size 设置/dev/shm的大小
--sig-proxy 设置由代理接受并处理信号,默认值为true
--tty,-t 分配tty设备用来支持终端登录
--ulimit Ulimit配置
--user,-u 指定容器的用户
--volume,-v 设置容器挂载的存储卷,即挂载到容器的某个目录
--volumes-from 给容器挂载其他容器上的卷
--workdir,-w 设置容器的工作目录
示例
使用redis:latest
镜像以后台模式启动一个名为myredis
的容器,将容器的6379
端口映射到主机的6379
端口:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker run -d --name myredis -p 6379:6379 redis
7af847b2a8a13eefbd580073884afdba26719ce47b76aea852df4686b5745d16
使用tomcat:9-jre8
镜像以后台模式启动一个名为tomcat-9-jre8
的容器,将容器的8080
端口映射到主机的9000
端口,将容器的/usr/local/tomcat/webapps
目录映射到主机的/usr/local/webapps
目录:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker run -d --name tomcat-9-jre8 -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:9-jre8
0ee9220ebc32435e74fa2f62b75215038ec6dfedc425869c218519090c333f97
使用mysql:8.0.16
镜像以交互模式启动一个名为mysql-8.0.16
的容器,将容器的3306
端口映射到主机的33306
端口,将容器的环境变量MYSQL_ROOT_PASSWORD
设置为root
,设置容器的工作目录为/usr/local/workdir/
,设置容器使用内存的最大值为1GB
:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker run -it --name mysql-8.0.16 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root -w /usr/local/workdir/ -m 1GB mysql:8.0.16 /bin/bash
root@4d6cf5eab5ee:/usr/local/workdir# mysql -u root -p
Enter password:
(2)创建不启动容器
格式
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
选项
同 run
命令。
示例
使用nginx:latest
镜像创建一个名为mynginx
的容器,容器80
端口映射主机80
端口,不运行:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker create --name mynginx -p 80:80 nginx:latest
126b2f3b586be24764ff4e449ad10759c0d04fe36e785bbcb92b032cf79a2f54
(3)启动容器
启动一个或多个已停止的容器。
格式
docker start [OPTIONS] CONTAINER [CONTAINER...]
选项
--attach,-a 将标准输入、标准输出、标准错误连接到容器,传递所有信号
--checkpoint 从该checkpoint恢复
--checkpoint-dir 使用自定义checkpoint存储目录
--detach-keys 覆盖用于分离容器的key序列
--interactive,-i 激活标准输入
示例
启动容器id为126b2f3b586be24764ff4e449ad10759c0d04fe36e785bbcb92b032cf79a2f54
的容器(用容器名mynginx
启动也可以):
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker start 126b2f3b586be24764ff4e449ad10759c0d04fe36e785bbcb92b032cf79a2f54
126b2f3b586be24764ff4e449ad10759c0d04fe36e785bbcb92b032cf79a2f54
(4)停止容器
停止一个或多个运行中的容器。
格式
docker stop [OPTIONS] CONTAINER [CONTAINER...]
选项
--time,-t 设置终止容器前的等待时间,单位为秒,默认值为10
示例
停止mynginx
和mysql-8.0.16
容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker stop mynginx mysql-8.0.16
mynginx
mysql-8.0.16
(5)重启容器
重启一个或多个容器。
格式
docker restart [OPTIONS] CONTAINER [CONTAINER...]
选项
--time,-t 设置终止容器前的等待时间,单位为秒,默认值为10
示例
重启myredis
和tomcat-9-jre8
容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker restart myredis tomcat-9-jre8
myredis
tomcat-9-jre8
(6)在运行的容器中执行命令
格式
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
选项
--detach,-d 分离模式:后台运行
--detach-keys 覆盖用于分离容器的key序列
--env,-e 设置环境变量
--interactive,-i 即使没有附加也保持STDIN标准输入打开
--privileged 指定容器是否为特权容器
--tty,-t 分配一个伪终端
--user,-u Username或UID(format: <name|uid>[:<group|gid>])
--workdir,-w 设置容器的工作目录
示例
在运行中的容器myredis
中设置工作目录/usr/local
并执行pwd
命令:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker exec -it -w /usr/local myredis pwd
/usr/local
在运行中的容器myredis
中设置环境变量,并进入容器终端,执行env
命令:
(docker exec -it -e VAR=1 myredis /bin/bash
这种写法和下面效果一样)
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker exec -it -e VAR=1 myredis bash
root@7af847b2a8a1:/data# env
HOSTNAME=7af847b2a8a1
REDIS_DOWNLOAD_SHA=61db74eabf6801f057fd24b590232f2f337d422280fd19486eca03be87d3a82b
PWD=/data
HOME=/root
REDIS_VERSION=5.0.7
GOSU_VERSION=1.11
TERM=xterm
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.7.tar.gz
SHLVL=1
VAR=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
(7)暂停容器中所有进程
格式
docker pause CONTAINER [CONTAINER...]
示例
暂停myredis
和tomcat-9-jre8
中所有进程:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker pause myredis tomcat-9-jre8
myredis
tomcat-9-jre8
(8)恢复容器中所有的进程
格式
docker unpause CONTAINER [CONTAINER...]
示例
恢复myredis
和tomcat-9-jre8
中所有进程:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker unpause myredis tomcat-9-jre8
myredis
tomcat-9-jre8
(9)杀死容器
杀死一个或多个运行中的容器。
格式
docker kill [OPTIONS] CONTAINER [CONTAINER...]
选项
--signal,-s 向容器发送一个信号,默认值为KILL
示例
杀死myredis
容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker kill -s KILL myredis
myredis
(10)删除容器
删除一个或多个运行中的容器。
格式
docker rm [OPTIONS] CONTAINER [CONTAINER...]
选项
--force,-f 强制删除一个运行中的容器(使用SIGKILL)
--link,-l 移除容器间的网路连接而非容器本身
--volumes,-v 删除与容器关联的卷
示例
强制删除myredis
容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker rm -f myredis
myredis
5.容器操作
(1)输出容器列表
格式
docker ps [OPTIONS]
选项
--all,-a 显示所有的容器(默认只显示运行中的容器)
--filter,-f 基于条件进行输出过滤
--format 指定返回值的模板文件
--last,-n 显示最近创建的n个容器(包括所有状态)
--latest,-l 显示最近创建的容器(包括所有状态)
--no-trunc 不截断输出
--quiet,-q 只显示容器id
--size,-s 显示总的文件大小
示例
只显示运行中的容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e16a397956d3 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp myredis
0ee9220ebc32 tomcat:9-jre8 "catalina.sh run" 51 minutes ago Up 34 minutes 0.0.0.0:9000->8080/tcp tomcat-9-jre8
显示所有容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e16a397956d3 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp myredis
126b2f3b586b nginx:latest "nginx -g 'daemon of…" 46 minutes ago Exited (0) 37 minutes ago mynginx
4d6cf5eab5ee mysql:8.0.16 "docker-entrypoint.s…" 49 minutes ago Exited (1) 48 minutes ago mysql-8.0.16
0ee9220ebc32 tomcat:9-jre8 "catalina.sh run" 51 minutes ago Up 34 minutes 0.0.0.0:9000->8080/tcp tomcat-9-jre8
(2)获取容器元数据
格式
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
选项
--format,-f 指定返回值的模板文件
--size,-s 显示总的文件大小
--type 为指定类型返回JSON
示例
获取myredis
容器的ip地址:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myredis
172.17.0.2
获取创建mysql-8.0.16
容器的镜像名:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker inspect --format='{{.Config.Image}}' mysql-8.0.16
mysql:8.0.16
获取mysql-8.0.16
容器的JSON格式的元数据:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker inspect --format='{{json .Config}}' mysql-8.0.16
{"Hostname":"4d6cf5eab5ee","Domainname":"","User":"","AttachStdin":true,"AttachStdout":true,"AttachStderr":true,"ExposedPorts":{"3306/tcp":{},"33060/tcp":{}},"Tty":true,"OpenStdin":true,"StdinOnce":true,"Env":["MYSQL_ROOT_PASSWORD=root","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.7","MYSQL_MAJOR=8.0","MYSQL_VERSION=8.0.16-2debian9"],"Cmd":["/bin/bash"],"Image":"mysql:8.0.16","Volumes":{"/var/lib/mysql":{}},"WorkingDir":"/usr/local/workdir","Entrypoint":["docker-entrypoint.sh"],"OnBuild":null,"Labels":{}}
(3)获取容器日志
格式
docker logs [OPTIONS] CONTAINER
选项
--details 显示提供给日志的额外详细信息
--follow,-f 跟踪日志输出
--since 显示某个时间开始的所有日志
--tail 仅列出最新n条容器日志
--timestamps,-t 显示时间戳
--until 显示某个时间之前的所有日志
示例
跟踪获取myredis
容器2s之前的日志:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker logs -f --until=2s myredis
1:C 11 Jan 2020 12:26:06.587 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 11 Jan 2020 12:26:06.587 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 11 Jan 2020 12:26:06.587 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 11 Jan 2020 12:26:06.589 * Running mode=standalone, port=6379.
1:M 11 Jan 2020 12:26:06.589 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 11 Jan 2020 12:26:06.589 # Server initialized
1:M 11 Jan 2020 12:26:06.589 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 11 Jan 2020 12:26:06.589 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 11 Jan 2020 12:26:06.589 * Ready to accept connections
(4)显示容器中运行进程信息
格式
docker top CONTAINER [ps OPTIONS]
示例
查看myredis
容器中运行的进程信息:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker top myredis
UID PID PPID C STIME TTY TIME CMD
polkitd 26546 26530 0 20:26 ? 00:00:05 redis-server *:6379
(5)连接正在运行的容器
用于将标准输入与标准输出连接到正在运行的容器。
格式
docker attach [OPTIONS] CONTAINER
选项
--detach-keys 覆盖用于分离容器的key序列
--no-stdin 不激活STDIN标准输入
--sig-proxy 设置由代理接受并处理信号,默认值为true
示例
连接到正在运行的myredis
容器:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker attach --sig-proxy=false myredis
(6)阻塞运行容器
阻塞运行一个或多个容器直到容器停止,然后打印出它的退出代码。
格式
docker wait CONTAINER [CONTAINER...]
示例
阻塞运行的myredis
容器,新开一个终端停止myredis
容器,打印出了退出代码0
:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker wait myredis
0
(7)列出容器端口映射
格式
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
示例
列出运行中容器tomcat-9-jre8
的端口映射:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker port tomcat-9-jre8
8080/tcp -> 0.0.0.0:9000
(8)导出容器
将容器文件系统导出为一个tar文件。
格式
docker export [OPTIONS] CONTAINER
选项
--output,-o 将输入内容写到文件代替STDOUT标准输出
示例
将myredis
容器文件系统导出为myredis.tar
文件:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker export -o myredis.tar myredis
[root@iZwz94v2sdd3v6zcczsu67Z ~]# ls
10 myjava.tar myredis.tar
(9)基于容器创建镜像
格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项
--author,-a 提交的镜像作者(e.g., “John Hannibal Smith hannibal@a-team.com”)
--change,-c 使用Dockerfile指令来创建镜像
--message,-m 提交时的说明信息
--pause,-p commit时暂停容器,默认值为true
示例
基于tomcat-9-jre8
容器创建一个mytomcat:v1
镜像:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker commit -a rtxtitanv -p tomcat-9-jre8 mytomcat:v1
sha256:eef2896cd9b93a0b5b1ad579dbbda63e0b6e6b0cfbde3a6fcf8fafb0a36baa34
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker images mytomcat:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat v1 eef2896cd9b9 24 seconds ago 464MB
(10)容器与主机间的数据拷贝
格式
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
选项
--archive,-a 存档模式(复制所有uid/gid信息)
--follow-link,-L 保持源目标中的链接
示例
将主机/usr/local/src/data
目录拷贝到mysql-8.0.16
容器/usr/local/workdir/logs
目录下:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker cp /usr/local/src/data mysql-8.0.16:/usr/local/workdir/logs
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker exec -it mysql-8.0.16 bash
root@4d6cf5eab5ee:/usr/local/workdir# cd logs
root@4d6cf5eab5ee:/usr/local/workdir/logs# ls
data
将mysql-8.0.16
容器/usr/local/workdir/logs/data
目录拷贝到主机/usr/local
目录下:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker cp mysql-8.0.16:/usr/local/workdir/logs/data /usr/local
[root@iZwz94v2sdd3v6zcczsu67Z ~]# cd /usr/local
[root@iZwz94v2sdd3v6zcczsu67Z local]# ls
aegis bin data etc games include lib lib64 libexec sbin share src webapps
(11)检查容器中文件结构的更改
格式
docker diff CONTAINER
示例
查看容器mysql-8.0.16
中文件结构的更改:
[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker diff mysql-8.0.16
C /usr
C /usr/local
A /usr/local/workdir
A /usr/local/workdir/logs
A /usr/local/workdir/logs/data
C /root
A /root/.bash_history