前言
之前写过ubuntu的安装,新换家公司发现都是用centos的系统,总结一篇docker在centos上的操作
一、安装前准备
1、硬件要求
CentOS 7(64-bit),内核版本不能低于3.10;
CentOS 6.5(64-bit或更新的版本),内核版本为 2.6.32-431 或者更高版本,一般不建议在CentOS 6.x下安装Docker,因为往往CentOS 6.x往往需要先升级内核版本以达到安装条件,但是升级内核可能会导致开不了机之类的问题。
2、卸载旧版本
较旧版本的Docker被称为docker或docker-engine。如果已安装这些,请卸载它们以及相关的依赖项。
复制代码
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
二、安装Docker
1、使用yum安装
A.安装所需依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
由于国内网络问题,建议使用国内源!!!
国内源:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
官方源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看可用版本有哪些
yum list docker-ce --showduplicates | sort -r
如果需要测试版本的 Docker CE 请使用以下命令:
sudo yum-config-manager --enable docker-ce-test
如果需要每日构建版本的 Docker CE 请使用以下命令:
sudo yum-config-manager --enable docker-ce-nightly
B.更新yum缓存并安装Docker-ce
sudo yum makecache fast
sudo yum -y install docker-ce
C.启动Docker-ce
sudo systemctl enable docker
sudo systemctl start docker
D.建立docker用户组
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立docker组:
sudo groupadd docker
将当前用户添加到docker组中:
sudo usermod -aG docker $USER
退出当前终端并重新登录,进行如下命令测试,若能正常输出以上信息,则说明安装成功。
[123@j~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
E.镜像加速
如果在使用过程中发现国内网络拉取 Docker 镜像十分缓慢,比如出现拉取镜像Timeout的问题,可以配置 Docker 国内镜像加速。
国内加速地址有:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
阿里云容器 服务
https://cr.console.aliyun.com/
首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com”
例如,对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}
#注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。
重启docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
# 或者
service docker restart
查看加速器是否生效:
执行 docker info,如果从结果中看到了如下内容,说明配置成功。
Registry Mirrors:
https://dockerhub.azk8s.cn/
https://reg-mirror.qiniu.com/
清除无用的镜像
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi
docker images |awk '{print "docker rmi " $3}'| sh 一键删除所有镜像
docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。
查看docker各个容器内存使用情况:docker stats
批量删除运行的镜像
方法一:
docker stop $(docker ps -a | grep "xxx" | awk '{print $1}')
docker stop 停止容器
$() 返回在括号内运行脚本的结果
docker ps -a 列出所有容器的docker | grep
“xxx” 管道上一个命令的结果,grep以搜索包含字符串xxx的行 | awk ‘{print $1}’
管道的结果grep搜索到的awk命令,该命令被告知仅打印在第1列,其是容器的ID的值
方法二:
docker ps | grep "xxx" | awk '{print $1}' | xargs docker stop
docker ps 用于列出所有正常运行的容器
| grep filter 将上一命令的结果通过管道传给过滤器,过滤条件为包含xxx关键字
| awk ‘{print $1}’ 将上一命令的结果通过管道传给awk, awk ‘{print $1}’
打印第一列的数据,也就是容器ID | xargs docker stop 将上一命令的结果通过管道传给xargs,
xargs 将参数传给docker stop,然后停止这些容器
Docker命令详解
docker --help
docker --help
用法: docker COMMAND
A self-sufficient runtime for containers
选项:
--config string Location of client config files (default
"C:\\Users\\junchow\\.docker")
-D, --debug 开启debug模式
-H, --host list Daemon socket(s) to connect to
-l, --log-level string 设置日志级别,级别分为debug|info|warn|error|fatal,默认为info。
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default
"C:\\Users\\junchow\\.docker\\machine\\machines\\default\\ca.pem")
--tlscert string Path to TLS certificate file (default
"C:\\Users\\junchow\\.docker\\machine\\machines\\default\\cert.pem")
--tlskey string Path to TLS key file (default
"C:\\Users\\junchow\\.docker\\machine\\machines\\default\\key.pem")
--tlsverify Use TLS and verify the remote (default true)
-v, --version 终端打印显示版本信息并退出
管理命令:
config 管理Docker配置
container 管理容器
image 管理镜像
network 管理网络
node 管理Swarm节点
plugin 管理插件
secret 管理Docker安全
service 管理服务
swarm 管理Swarm集群
system 管理Docker系统
trust Manage trust on Docker images
volume 管理卷
命令:
attach 将标准输入和标准输出连接到正在运行的容器
build 使用dockerfile文件创建镜像
commit 从容器的修改项中创建新的镜像
cp 将容器的目录或文件复制到本地文件系统中
create 创建一个新的镜像
diff 检查容器文件系统的修改
events 实时输出docker服务器中发生的事件
exec 从外部运行容器内部的命令
export 将容器的文件系统到处为tat文件包
history 显示镜像的历史
images 输出镜像列表
import 从压缩为tar文件的文件系统中创建镜像
info 显示当前系统信息、docker容器与镜像个数、设置信息等
inspect 使用JSON格式显示容器与镜像的详细信息
kill 向容器发送kill信号关闭容器
load 从tar文件或标准输入中加载镜像
login 登录docker注册服务器
logout 退出docker注册服务器
logs 输出容器日志信息
pause 暂停容器中正在运行的所有进程
port 查看容器的端口是否处于开放状态
ps 输出容器列表
pull 从注册服务器中拉取一个镜像或仓库
push 将镜像推送到docker注册服务器
rename 重命名一个容器
restart 重启一个或多个容器
rm 删除一个或多个容器,若没有指定标签则删除lastest标签。
rmi 删除一个或多个镜像,若没有指定标签则删除lastest标签。
run 在一个新容器中中运行命令,用于指定镜像创建容器。
save 将一个或多个镜像保存为tar包
search 从Docker Hub中搜索镜像
start 启动一个或多个已经停止的容器
stats Display a live stream of container(s) resource usage statistics
stop 停止一个或多个正在运行的容器
tag 设置镜像标签
top 显示容器中正在运行的进程信息
unpause 重启pause命令暂停的容器
update 更新一个或多个容器的配置
version 显示docker版本信息
wait 等待容器终止然后输出退出码
Run 'docker COMMAND --help' for more information on a command.
docker 运行周期
docker run
使用 docker run 启动容器,docker在后台的标准操作流程:
检查本地是否存在指定的镜像,若不存在则从公有仓库下载。
使用镜像创建并启动容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层。
从宿主机配置的网桥接口中桥接一个虚拟机接口到容器中去
从地址池分配一个IP地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
# run用于指定镜像创建容器
$ docker run [选项] <镜像名称, id> [命令] [参数]
# 选项
-d, --detach=false 指定容器运行于前台还是后台,默认为false。
-i, --interactive=false 打开标准输入用于控制台交互
-t, --tty=false 分配tty设备用来支持终端登录,默认为false。
-u, --user="" 指定容器的用户
-a, --attach=[] 登录容器,必须是以docker run -d启动的容器。
-w, --workdir="" 设置容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景下使用。
-e, --env=[] 设置环境变量,容器中可使用该环境变量。
-m, --memory="" 设置容器的内存上限
-p, --public=[] 设置容器暴露的端口
-h, --hostname="" 设置容器的主机名
-v, --volume=[] 设置容器挂载的存储卷,也就是挂载到容器的某个目录。
--volumn-from=[] 给容器挂载其他容器上的卷,也就是挂载到容器的某个目录。
--cap-add=[] 添加权限
--cap-drop=[] 删除权限
--cidfile="" 运行容器后在指定文件中写入容器PID值,这是典型的监控系统的用法。
--cpuset="" 设置容器可以使用那些CPU,此参数用来设置容器独占CPU。
--device=[] 添加主机设备给容器,相当于设备直通。
--dns=[] 设置容器的DNS服务器
--dns-search=[] 设置容器的DNS搜索域名,写入到容器的/etc/resolv.conf文件。
--env-file=[] 设置环境变量文件,文件格式为每行一个环境变量。
--expose=[] 设置容器暴露的端口,即修改镜像的暴露端口。
--link=[] 设置容器之间的关联关系,使用其他容器的IP、env等信息。
--lxc-conf=[] 设置容器的配置文件,只有在指定--exe-driver=lxc时使用。
--name="" 设置容器的名称,可通过名字进行容器管理,links特性需要使用名字。
--net="bridge" 容器网络设置
--privileged=false 设置容器是否为特权容器,特权容器拥有所有的capabilities。
--restart="no" 设置让其停止后的重启策略
--rm=false 设置容器停止后自动删除容器,不支持以docker run -d启动的容器。
--sig-proxy=true 设置由代理接收并处理信号,但SIGCHLD、SIGSTOP、SIGKILL不能被代理。
# 命令
-d, --detach Detach模式,默认为守护进程模式,即容器以后台方式运行。
--rm=false 若容器内的进程终止则自动删除容器,禁止和-d选项一起使用。
--sig-proxy=true 将所有信号传递给进程,非TTY模式也一样,但不能传递SIGCHLD、SIGKILL、SIGSTOP信号。
# 运行一个在后台执行的容器,同时使用控制台管理。
$ docker run -i -t -d ubuntu:latest
# 运行一个带命令且在后台不断执行的容器,不直接展示容器内部信息。
$ docker run -d ubuntu:latest ping www.docker.com
# 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,可用控制台管理。
$ docker run -d --restart=always ubuntu:latest ping www.docker.com
# 为容器指定一个名字
$ docker run -d --name=ubuntu_server ubuntu:latest
# 容器暴露80端口并指定宿主机81端口与其通信(宿主机端口:容器端口)
$ docker run -d --name=ubuntu -p 81:80 ubuntu:latest
# 指定容器内目录与宿主机目录共享(宿主机目录:容器目录)
$ docker run -d --name=ubuntu_server -v /home/www:/var/www ubuntu:latest
# 设置宿主机与docker的共享目录
$ docker run -d -i -t -p 80:80 -v /share/swoft:/var/www/swoft --name swoft swoft/swoft /bin/bash
docker create
# create 使用指定的镜像创建容器,与run命令不同的是,使用create命令只能创建容器而并不启动。
$ docker create [选项] <镜像名称,id> <命令> [参数]
# 选项
-a, --attach=[] 将标准输入、标准输出、标准错误链接到容器
-C, --cpu-shares=0 设置CPU资源分配,默认为1024。
-e, --env=[] 向容器设备环境变量,用于传递设置或密码。
-h, --hostname="" 设置容器主机名
-i, --interactive=false 激活标准输入,即使未与容器连接,也维持标准输入。
-m, --memory="" 设置内存限制,格式<数字><单位>,单位可用b、k、m、g。
-P, --publish-all=false 将连接到主机的容器的所有端口暴露在外
-p, --publish=[] 将连接到主机的容器的特定端口暴露在外,主要用于暴露web服务器的端口。
-t, --tty=false 使用TTY模式,若要使用Bash则必须设置该选项。
-u, --user="" 设置容器运行时要使用的Linux用户账户和UID
-v, --volume=[] 设置数据卷,设置要与主机共享的目录,不将文件保存到容器而是直接保存到主机,在主机目录后添加:ro与:rw进行读写设置,默认未:rw。
-w, --workdir="" 设置容器内部要运行进程的目录
-add-host=[] 向容器的/etc/hosts添加主机名与IP地址
--cap-add=[] 设置容器中使用的cgroups的特定capablity,若设置为all则使用所有的capablity。
--cap-drop=[] 从容器中删除cgroup的特定capablity。
--cidfile="" 设置cid文件路径,cid中存储着所创建容器的id。
--cpuset="" 在多核CPU中设置要运行容器的核心数
--device=[] 添加主机设备到容器,格式为<主机设备>:<容器设备>
--dns=[] 设置容器中使用的DNS服务器
--dns-search=[] 设置docker中要使用的DNS搜索域
--entrypoint="" 忽略Dockerfile的ENTRYPOINT设置,强制设置为其他值。
--env-file=[] 向容器应用设置环境变量文件
--expose=[] 仅连接容器的端口和主机,并不暴露在外。
--link=[] 进行容器连接,格式 <容器名称>:<别名>
--lxc-conf=[] 若使用LXC驱动则可设置LXC选项
--name 设置容器名称
--net="bridge" 设置容器的网络模式
--privileged=false 在容器内部使用主机的所有linux内核功能
--restart="" 设置容器内部进程终止时重启策略
--security-opt=[] 设置SELinux、AppArmor选项
--volumn-from=[] 连接数据卷容器,设置格式未<容器名称,id>:<:ro, :rw>,默认读写设置遵从-v选项的设置。
# 使用docker镜像nginx:latest创建一个容器名为ubuntu_serve
$ docker create --name ubuntu_serve ubuntu:latest
$ docker create -it --name ubuntu_server ubutnu:latest /bin/bash
docker start
#start用于启动容器
$ docker start <选项><容器名称, id>
# 选项
-a, --attach=false 将标准输入、标准输出、标准错误连接到容器,传递所有信号。
-i, --interactive=false 激活标准输入
docker restart
#restart 用于重启容器
$ docker restart [选项] <容器名称, id>
docker stop
#stop用于终止容器
$ docker stop <选项><容器名称, id>
# 选项
-t, --timeout=10 设置终止容器前的等待时间,单位为秒。
docker pause
# pause 用于暂停容器中所有的进程
$ docker pause [选项] <容器名称, id>
docker unpause
# unpause用于重启使用pause命令暂停的容器
$ docker unpause <容器名称, id>
docker kill
# kill用于杀掉一个运行中的容器,发送SIGKILL信号来停止的主进程。
$ docker kill [选项] <容器名称, id>
# 选项
-s 向容器发送一个信号
# 杀死运行中的容器nginx
$ docker kill -s KILL nginx
docker rm
# rm用于删除一个或多个容器
$ docker rm [选项] <容器名称,id>
# 选项
-f 通过SIGKILL信号强制删除一个运行中的容器
-l 移除容器间的网路连接而非容器本身
-v 删除与容器关联的卷
# 强制删除容器test
$ docker rm -f test
# 删除容器test并删除挂载的数据卷
$ docke rm -v test
docker本地镜像
docker images
# images用于输出镜像列表
$ docker images <选项><镜像名称, id>
# 选项
-a, --all=false 列出所有镜像包含父镜像。
-f, --filter=[] 设置输出结果过滤,若设置为dangling=true则仅输出无名镜像。
--no-trunc=false 显示所有因内容过长而省略的部分
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker rmi
# rmi 用于删除镜像,若没有指定标签则会删除latest标签。
$ docker rmi <注册名称>/<镜像名称, id>:<标签>
# 选项
-f, --force=false 强制删除镜像
--no-prune=false 不删除不带标签的父级镜像
# 删除所有镜像
$ docker rmi `docker images -aq`
docker tag
# tag用于设置镜像标签
$ docker tag <选项><镜像名称>:<标签><注册地址, 用户名>/<镜像名称>:<标签>
# 选项
- f, --force=false 强制设置,即使已拥有标签,如远程仓库设置标签。
docker save
若不设置 -o 选项,tar包文件会输出到标准输出,所以必须设置重定向。如果仅指定镜像名称但没有>指指定标签,则会将所有标签都保存到一个tar包文件中。
# save用于将镜像保存为tag包文件
$ docker save <选项><镜像名称>:<标签>
# 选项
-o, --output="" 设置保存时的文件名称
docker load
# load从tar文件或标准输入中加载镜像
docker load -i tmf-web20191123.tar
docker load < 你的路径/rabbitmq.tar
docker search
# search用于在docker hub中搜索镜像
$ docker search <选项><搜索关键词>
# 选项
--automated=false 只显示由docker hub的automated build创建的镜像
--no-trunc=false 显示所有因内容过长而省略的部分
-s, --stars=0 显示有特定星级以上的镜像
容器操作
docker ps
# ps用于输出容器列表
$ docker ps <选项>
# 选项
-a, --all=false 列出所有容器,不带-a则输出当前正在运行的容器。
--before="" 列出特定容器创建前的容器,包含停止的容器。
-f, --filter=[] 设置输出过滤
-l, --latest=false 列出最后创建的容器包含停止的容器
-q, --quiet=false 只输出容器的ID
docker container update --restart=always 容器id 修改容器为自启动
docker exec
# exec 用于在运行中的容器中执行命令
$ docker exec [选项] <容器名称, id> <命令> [参数]
# 选项
-d 分离模式即在后台运行
-i 即使没有附加也保持STDIN标准输入打开
-t 分配一个伪终端
# 在容器test中以交互模式执行容器内/root/test.sh脚本
$ docker exec -it test /bin/sh /root/test.sh
docker top
# top用户显示容器中正在 运行的进程信息
$ docker top <容器名称, id><ps选项>
$ docker top
docker attach
# attach 用于将标准输入与标准输出连接到正在运行的容器
$ docker attach <选项><容器名称, id>
docker logs
# logs用于获取容器的日志
$ docker logs [选项] <容器名称,id>
# 选项
-f 跟踪日志输出
--since 显示某个开始时间的所有日志
-t 显示时间戳
--tail 仅仅列出最新n条容器日志
--details 日志细节
# 跟踪查看test容器的日志
$ docker logs -f test
# 查看mytest容器从2020年1月7日以后的最新10条日志
$ docker logs --since="2020-01-07" --tail=10 mytest
# 查看容器日志文件大小
root@default: ~$ ls -lh $(find /var/lib/docker/containers/ -name *-json.log)
-rw-r-----. 1 root root 2.1M 1月 7 14:01 /var/lib/docker/containers/2bec0888f410833dc88c8b0c69317fd9fb8bbe9bce72e2e4534d0539fba677b3/2bec0888f410833dc88c8b0c69317fd9fb8bbe9bce72e2e4534d0539fba677b3-json.log
# 进入日志目录
root@default: ~$ cd /var/lib/docker/containers/2bec0888f410833dc88c8b0c69317fd9fb8bbe9bce72e2e4534d0539fba677b3
# 临时清理日志文件
root@default: /var.../$ truncate -s 0 /var/lib/docker/containers/<container_id>/*-json.log
# 临时清理日志文件
root@default: /var../$ cat /dev/null > *-json.log
# 使用rm删除日志文件后是需要重启容器的,如果容器运行状态下Linux进程会引用着不会释放磁盘空间。
root@default /var/.../$ rm -rf *-json.log
docker port
# port用于列出指定容器的端口映射,或者用于查找将PRIVATE_PORT NAT到面向公众的端口。
$ docker port [选项] <容器名称,id> [PRIVATE_PORT[/PROTO]]
# 查看test容器的端口映射情况
$ docker port test
docker信息查看
docker info
info用于显示当前系统信息、docker容器和镜像数量、设置等信息。
docker version
version用户输出docker的版本信息