1. docker安装及概述
docker命令大全:https://www.runoob.com/docker/docker-command-manual.html
docker官网下载地址:https://docs.docker.com/engine/install/centos/#installation-methods
要在CentOS上启动Docker引擎,请确保满足先决条件,然后安装Docker。
先决条件
操作系统要求
- 要安装Docker引擎,您需要维护的CentOS 7版本。不支持或测试存档版本。
- 必须启用centos extras存储库。默认情况下,此存储库已启用,但如果已禁用,则需要重新启用它。
- 建议使用overlay2存储驱动程序。
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
旧版本的Docker称为Docker或Docker引擎。如果安装了这些程序,请卸载它们以及相关的依赖项。
/var/lib/docker/的内容(包括图像、容器、卷和网络)将被保留。Docker引擎包现在称为Docker ce。
主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有图像、容器和卷,请执行以下操作:
rm -rf /var/lib/docker
您必须手动删除任何已编辑的配置文件。
使用存储库安装
设置存储库
安装yum utils包(它提供了yum config manager实用程序)并设置稳定的存储库。
$ sudo yum install -y yum-utils $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
或者直接编译repo文件:
[docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
安装最新版本的Docker Engine和containerd,或转到下一步安装特定版本:
yum install docker-ce docker-ce-cli containerd.io
要安装特定版本的Docker Engine,请在repo中列出可用版本,然后选择并安装:
a、 列出并排序回购协议中可用的版本。此示例按版本号从高到低对结果进行排序,并被截断:
$ yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
按其包名称(docker-ce))和版本字符串(第二列)安装特定版本,该字符串从第一个冒号(:)开始,直到第一个连字符,用连字符(—)分隔。例如docker-ce-18.09.1。
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
此时Docker已安装但未启动。docker组已创建,但没有用户添加到该组中。
启动Docker.
systemctl start docker
运行hello world映像,验证Docker引擎是否正确安装。
docker run hello-world
此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出。
Linux的安装后步骤
Docker守护进程绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字归用户root所有,其他用户只能使用sudo访问它。Docker守护进程始终作为根用户运行。
如果不想在docker命令前面加sudo,请创建一个名为docker的Unix组并向其中添加用户。当Docker守护进程启动时,它会创建一个Unix套接字
可由docker组成员访问。
创建docker组并添加用户:
创建docker组。
sudo groupadd docker
将您的用户添加到docker组
usermod -aG docker $USER
注销并重新登录,以便重新评估您的组成员资格。在桌面Linux环境(如X Windows)中,完全注销会话,然后重新登录。
在Linux上,还可以运行以下命令来激活对组的更改:
newgrp docker
确认可以在不使用sudo的情况下运行docker命令
docker run hello-world
如果在将用户添加到Docker组之前最初使用sudo运行Docker CLI命令,则可能会看到以下错误,这表明由于sudo命令的原因,~/.Docker/目录的创建权限不正确。
WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied
要解决此问题,请删除~/.docker/目录(该目录将自动重新创建,但任何自定义设置都将丢失),或者使用以下命令更改其所有权和权限:
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R sudo chmod g+rwx "$HOME/.docker" -R
使用docker日志读取远程日志驱动程序的容器日志
配置默认日志驱动程序
Docker提供了通过一系列日志驱动程序从主机上运行的所有容器收集和查看日志数据的功能。默认的日志驱动程序json file将日志数据写入主机文件系统上json格式的文件。随着时间的推移,这些日志文件的大小会扩大,从而导致磁盘资源的潜在耗尽。为了缓解这些问题,可以配置另一个日志驱动程序,如Splunk或Syslog,或者为默认驱动程序设置日志循环。如果配置了备用日志驱动程序,请参阅使用docker log读取远程日志驱动程序的容器日志。
使用docker log读取远程日志驱动程序的容器日志
概述
在Docker Engine Enterprise 18.03之前,jsonfile和journald日志驱动程序支持使用docker logs读取容器日志。但是,许多第三方日志驱动程序不支持使用docker logs在本地读取日志,包括:
syslog gelf fluentd awslogs splunk etwlogs gcplogs logentries
这在尝试以自动化和标准的方式收集日志数据时产生了多个问题。日志信息只能通过第三方解决方案以该第三方工具指定的格式访问和查看。
从Docker Engine Enterprise 18.03.1-ee-1开始,您可以使用docker logs读取容器日志,而不必考虑配置的日志驱动程序或插件。此功能有时称为双重日志记录,允许您使用docker logs 以一致的格式在本地读取容器日志,而不考虑使用的远程日志驱动程序,因为引擎配置将信息记录到“local”日志记录驱动程序。有关更多信息,请参阅配置默认日志驱动程序。
先决条件
Docker Enterprise只支持双重日志记录,默认情况下从Engine Enterprise 18.03.1-ee-1开始启用。
用法
默认情况下启用双重日志记录。必须使用远程日志驱动程序配置docker守护程序或容器。
下面的示例显示了运行docker logs命令的结果,其中包含和不包含双重日志记录可用性:
没有双重记录功能:
当容器或dockerd配置了远程日志驱动程序(如splunk)时,尝试在本地读取容器日志时显示错误:
Step 1: Configure Docker daemon
$ cat /etc/docker/daemon.json { "log-driver": "splunk", "log-opts": { ... } }
Step 2: Start the container
docker run -d busybox --name testlog top
Step 3: Read the container logs
$ docker logs 7d6ac83a89a0 The docker logs command was not available for drivers other than json-file and journald.
具有双重记录功能:
要使用远程日志驱动程序(如splunk)配置容器或docker,请执行以下操作:
欢迎来到 Docker-Splunk 文档! |Docker-Splunk
Splunk简介,部署,使用 - 常见-youmen - 博客园 (cnblogs.com)
Step 1: Configure Docker daemon
$ cat /etc/docker/daemon.json { "log-driver": "splunk", "log-opts": { ... } }
Step 2: Start the container
docker run -d busybox --name testlog top
Step 3: Read the container logs
$ docker logs 7d6ac83a89a0 2019-02-04T19:48:15.423Z [INFO] core: marked as sealed 2019-02-04T19:48:15.423Z [INFO] core: pre-seal teardown starting 2019-02-04T19:48:15.423Z [INFO] core: stopping cluster listeners 2019-02-04T19:48:15.423Z [INFO] core: shutting down forwarding rpc listeners 2019-02-04T19:48:15.423Z [INFO] core: forwarding rpc listeners stopped 2019-02-04T19:48:15.599Z [INFO] core: rpc listeners successfully shut down 2019-02-04T19:48:15.599Z [INFO] core: cluster listeners successfully shut down
限制:
不能指定多个日志驱动程序。
如果使用远程发送日志的日志驱动程序或插件的容器突然出现“网络”问题,则不会对本地缓存进行“写入”。
如果写入日志驱动程序因任何原因(文件系统已满,写入权限已删除)失败,则缓存写入将失败并记录在守护程序日志中。未重试缓存的日志项。
在默认配置中,某些日志可能会从缓存中丢失,因为使用环形缓冲区来防止在文件写入缓慢时阻塞容器的stdio。当守护进程关闭时,管理员必须修复这些问题。
使用systemd单元文件配置远程访问
使用命令sudo systemctl edit docker.service在文本编辑器中打开docker.service的覆盖文件。
添加或修改以下行,替换您自己的值。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
Reload the systemctl
configuration.
systemctl daemon-reload
Restart Docker.
systemctl restart docker.service
检查netstat的输出,确认dockerd正在监听配置的端口,以查看是否执行了更改。
netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
使用daemon.json配置远程访问
将/etc/docker/daemon.json中的hosts数组设置为连接到UNIX套接字和IP地址,如下所示:
{ "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"] }
Restart Docker.
检查netstat的输出,确认dockerd正在监听配置的端口,以查看是否执行了更改。
sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
在Docker守护进程上启用IPv6
要在Docker守护进程上启用IPv6,请参阅启用IPv6支持。
为Docker指定DNS服务器
配置文件的默认位置是/etc/docker/daemon.json。您可以使用--config file 参数更改配置文件的位置。下面的文档假设配置文件位于/etc/docker/daemon.json
1、创建或编辑Docker守护进程配置文件,默认为/etc/Docker/daemon.json文件,该文件控制Docker守护进程配置。
nano /etc/docker/daemon.json
2、添加一个或多个IP地址作为值的dns密钥。如果文件包含现有内容,则只需添加或编辑dns行。
{ "dns": ["8.8.8.8", "8.8.4.4"] }
如果您的内部DNS服务器无法解析公共IP地址,请至少包含一个可以解析的DNS服务器,以便您可以连接到Docker Hub,并且您的容器可以解析internet域名。
3、重新启动Docker守护进程
service docker restart
4、验证Docker是否可以通过尝试提取映像来解析外部IP地址:
docker pull hello-world
5、如有必要,请验证Docker容器是否可以通过ping来解析内部主机名。
docker run --rm -it alpine ping -c4 <my_internal_host> PING google.com (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms 64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms 64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms 64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms
要禁用RHEL、CentOS或Fedora上的dnsmasq:
1、禁用dnsmasq服务:
service dnsmasq stop sudo systemctl disable dnsmasq
2、使用Red Hat文档手动配置DNS服务器。
####################
快捷键
退出:Ctrl-D or exit detach:Ctrl-P + Ctrl-Q
Namespace和Cgroup
1.Namespace — 实现进程、网络、消息、文件系统、主机名的隔离。 2.Cgroup — 实现对资源的配额和度量。 注:可以指定cpu个数,内存大小等
在 container 中启动一个长久运行的进程
JOB=$(docker run -d centos /bin/sh -c "while true;do echo hello world; sleep 1;done") #-d 后台运行容器,并返回容器ID; -c 待完成 # echo $JOB
从一个容器中取日志:
docker logs 容器的Name/ID # docker logs $JOB 查看日志: hello world
docker search centos #搜索镜像: docker pull centos #下载官方的 CentOS 镜像到本地 docker images #确认 CentOS 镜像已经被获取 docker load < c7moban.tar \\手动加载镜像。
创建容器
docker run -i -t --name centos7 -h linuxws -p 22:22 centos /bin/bash #创建一个 Docker 容器 -i 交互式操作 ; -t 分配一个终端; --name 容器的名字 -h 容器的主机名 -p:映射端口,前面80是虚拟机的端口
强制删除镜像
docker rm -f web01
docker 选项
-b, --bridge="" # 桥接网络,将容器附加到预先存在的网络桥上(Attach containers to a pre-existing network bridge) -g, --graph="/var/lib/docker" # 容器运行的根目录路径 --ip-forward=true # 开启转发 --iptables=true # 添加对应 iptables 规则 docker images -q #显示短容器ID
docker 命令
cp # 从容器中拷贝指定文件或者目录到宿主机中 logs # 输出当前容器日志信息 port # 查看映射端口对应的容器内部源端口 restart # 重启运行的容器 rm # 移除一个或者多个容器 rmi # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除] save # 保存一个镜像为一个 tar 包[对应 load] build # 通过 Dockerfile 定制镜像 history #显示镜像制作的过程,相当于dockfile load #与下面的save命令相对应,将下面sava命令打包的镜像通过load命令导入 images #列出本机的所有镜像 import #用tar文件新建一个镜像,与export命令相对应 docker import mysqldb.tar mysql:v1 logs #用于查看容器的日志 ps #列出所有容器,其中docker ps用于查看正在运行的容器,ps -a则用于查看所有容器。 pull #从docker hub中下载镜像 rename #更改容器的名字 restart #重启容器 search #从Docker Hub中搜索镜像 rmi #删除镜像 run #创建并启动容器 stats #动态显示容器的资源消耗情况,包括:CPU、内存、网络I/O tag #对镜像进行重命名 top #查看容器中正在运行的进程 unpause #恢复容器内暂停的进程,与pause参数相对应 version #查看docker的版本
登录Docker Hub
[root@localhost ~]# docker login #login:,需到官网注册账号 Username: ivictor Password:
上传本地镜像到Docker Hub
# docker push ivictor/centos:v1 #前提是登录docker hub
退出登录Docker Hub
[root@localhost ~]# docker logout #退出登录 Remove login credentials for https://index.docker.io/v1/
在宿主机和容器之间相互COPY文件
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH docker cp [OPTIONS] LOCALPATH CONTAINER:PATH
查看容器内发生改变的文件,以mysql容器为例
[root@localhost ~]# docker diff mysqldb C /root A /root/.bash_history
不难看出,C对应的均是目录,A对应的均是文件
实时输出Docker服务器端的事件,包括容器的创建,启动,关闭等。
[root@localhost ~]# docker events 2015-09-08T17:40:13.000000000+08:00 d2a2ef5ddb90b505acaf6b59ab43eecf7eddbd3e71f36572436c34dc0763db79: (from wordpress) create 2015-09-08T17:40:14.000000000+08:00 d2a2ef5ddb90b505acaf6b59ab43eecf7eddbd3e71f36572436c34dc0763db79: (from wordpress) die 2015-09-08T17:42:10.000000000+08:00 839866a338db6dd626fa8eabeef53a839e4d2e2eb16ebd89679aa722c4caa5f7: (from mysql) start
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
touche/centos6 latest 139b09783af3 13 months ago 577MB
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
查看docker的系统信息
# docker info Containers: 3 --当前有3个容器 Images: 298 Storage Driver: devicemapper Pool Name: docker-253:0-34402623-pool Pool Blocksize: 65.54 kB Backing Filesystem: xfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 8.677 GB --对应的是下面Data loop file大小 Data Space Total: 107.4 GB Data Space Available: 5.737 GB Metadata Space Used: 13.4 MB --对应的是下面Metadata loop file大小 Metadata Space Total: 2.147 GB Metadata Space Available: 2.134 GB
在运行的容器中执行命令
docker exec -d cc touch 123 #后台型任务其中,cc是容器名 docker exec -i -t cc /bin/bash #交互型任务: -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN(标准输入)打开 -t :分配一个伪终端
将容器的文件系统打包成tar文件,有两种方式:
docker export -o mysqldb1.tar mysqldb docker export mysqldb > mysqldb.tar
docker pause
pause --暂停容器内的所有进程, 此时,通过docker stats可以观察到此时的资源使用情况是固定不变的, 通过docker logs -f也观察不到日志的进一步输出。
输出容器端口与宿主机端口的映射情况
docker port blog 80/tcp -> 0.0.0.0:80 #容器blog的内部端口80映射到宿主机的80端口
启动、停止容器
docker start container #启动容器container docker stop container #停止容器container docker restart container #重启容器container
杀掉运行中的容器
docker kill -s KILL mynginx -s #向容器发送一个信号
删除容器,无法删除运行中的容器,必须先用docker stop或docker kill使其停止。
docker rm -f `docker ps -a -q` #一次性删除所有容器: -f #强制删除 -q #指的是只列出容器的ID
将镜像打包,与上面的load命令相对应
docker save -o nginx.tar nginx
暂停和继续容器
docker unpause CONTAINER # 继续暂停的容器 docker pause CONTAINER # 暂停一个容器,方便 commit
提交指定容器为镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] # 默认 commit 是暂停状态 -a, --author="" -m, --message="" 提交信息 -p, --pause=true
Docker 端口映射
通过容器 id 获取 ip
sudo docker inspect <container_id> | grep IPAddress | cut -d ’"’ -f 4
容器的 ip 是本地系统分配的,其他主机访问不到该容器的端口。容器每次启动时ip都会改变。
自动映射端口
docker run -t -P --expose 22 --name server ubuntu:14.04 -P #随机端口映射,容器内部端口随机映射到主机的高端口 --expose #指定对外提供服务的端口 -i #以交互模式运行容器,通常与 -t 同时使用; -t #为容器重新分配一个伪输入终端,通常与 -i 同时使用;
实例二:
docker run -P -d nginx:latest #使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口
映射的端口将会从没有使用的端口池中 (49000..49900) 自动选择,
通过docker ps、
docker inspect <container_id>或者
docker port <container_id> <port>确定具体的绑定信息。
绑定端口到指定接口
--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS 不仅搜索host,还会搜索 host.example.com 。 注意:如果没有上述最后 2 个选项, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
--link=CONTAINER_NAME:ALIAS \\添加一个其他容器的主机名到 /etc/hosts 文件中。
-p 指定端口映射,格式为:宿主机端口:容器端口
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。 docker run -p 80:80 -v /data:/data -d nginx:latest 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。 docker run -p 127.0.0.1:80:8080/tcp ubuntu bash 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。 runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/#
绑定UDP端口
docker run -p 127.0.0.1:53:5353/udp
进入容器后:
yum grouplist yum -y groupinstall "Minimal Install" [root@cd05639b3f5c /]# exit #断开与容器的连接 exit [root@localhost ~]# docker ps #显示正在运行容器
解决方法:
ntpdate cn.pool.ntp.org #同步一下时间