Docker在CentOS7上的安装及常用命令

Docker简介:Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。Docker分为CE和EE两大版本。CE即社区版,免费使用,EE即企业版,强调安全,付费使用。Docker Engine分为stabletestnightly三种类型的更新通道。

下面就总结一下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源。下面是可选操作,nighttest的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可以禁用和启用nighttest的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 installyum 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安装。如果要安装nighttest更新通道的Docker CE,将x86_64/stable/Packages/stable替换为nighttest即可。然后安装Docker Engine,执行以下命令,路径改为Docker软件包的路径:

sudo yum install /path/to/package.rpm

启动并加入开机启动:

sudo systemctl start docker
sudo systemctl enable docker

下面是通过脚本快捷安装。在测试或开发环境中,Docker官方为了简化安装流程,在get.docker.comtest.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:7java: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
示例

停止mynginxmysql-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
示例

重启myredistomcat-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...]
示例

暂停myredistomcat-9-jre8中所有进程:

[root@iZwz94v2sdd3v6zcczsu67Z ~]# docker pause myredis tomcat-9-jre8
myredis
tomcat-9-jre8

(8)恢复容器中所有的进程

格式
docker unpause CONTAINER [CONTAINER...]
示例

恢复myredistomcat-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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RtxTitanV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值