1 Docker容器
系统环境:docker
最低支持centos7
且在64位平台上,内核版本在3.10
以上
版本:社区版(免费),企业版(包含了一些收费服务)
1.1 安装Docker
安装docker 社区版前需要修改yum源为国内镜像源,不然用官方的yum源只能装docker
yum install docker-ce
启动docker
systemctl start/status docker
查看docker启动状态
docker version
1.2 加速下载和配置
1.2.1 使用yum-config-manager加速下载
如果觉得从官网的yum源安装太慢,可以用 yum-config-manager
修改yum源
点击了解yum源相关问题
yum-utils
提供了 yum-config-manager
,并且 device mapper
存储驱动程序需要 device-mapper-persistent-data 和 lvm2
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
使用以下命令来设置稳定的仓库
使用官方源地址(比较慢)
sudo yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
阿里云
sudo yum-config-manager --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华大学源
sudo yum-config-manager --add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
1.2.2 使用 wget 加速下载
下载yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
yum -y install docker-ce
启动并开机自启
systemctl start docker && systemctl enable docker
1.2.3 配置加速器
DaoCloud
加速器是广受欢迎的Docker
工具,解决了国内用户访问 Docker Hub
缓慢的问题。DaoCloud
加速器结合国内的 CDN
服务与协议层优化,成倍的提升了下载速度。
DaoCloud
官网:https://www.daocloud.io/mirror#accelerator-doc
一条命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
该脚本可以将 --registry-mirror
加入到 Docker
配置文件/etc/docker/daemon.json
中
或者直接操作文件:
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
1.3 如何修改Docker的存储位置
默认情况下 Docker
的存放位置为:/var/lib/docker
可以通过命令查看具体位置:docker info | grep “Docker Root Dir”
修改到其它目录:
- 首先停掉
Docker
服务:
systemctl stop docker
- 然后移动整个
/var/lib/docker
目录到目的路径
mkdir -p /root/data/docker
mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker --快捷方式
1.4 使用Docker帮助文档
docker
客户端非常简单,我们可以直接输入 docker
命令来查看到 Docker
客户端的所有命令选项
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats
指令的具体使用方法:
docker stats --help
2 Docker容器操作
2.1 Docker容器启动
Docker
启动容器有两种方式:
- 基于镜像新建一个容器并启动;
- 将处于终止状态 (
exited
)的容器重新启动
当利用docker run
来创建容器时,Docker
在后台运行的步骤如下:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
2.1.1 基于镜像新建容器并启动
通过如下命令来快速启动容器:
docker run --name mydocker
-d IMAGE:TAG
--network test-net
--dns=114.114.114.114
--rm
-h host_ubuntu
/bin/bash -c "while true;do echo 正在运行; sleep 1;done"
参数:
-
name
:给容器定义一个名称 -
d
:后台运行容器
后台运行的容器可以通过docker logs
命令来查看日志:
docker container logs [container ID or NAMES]
-
/bin/sh
:指定使用centos
的bash
解释器 -
c
:运行一段shell
命令
"while true;do echo 正在运行; sleep 1;done"
:在linux后台,每秒中打印一次正在运行 -
IMAGE
:镜像名称 -
TAG
:标签,镜像版本号 -
p 80:80
:端口映射
不同指定映射方法-
-p hostPort:containerPort
:端口映射 -p 8080:80 -
-p ip:hostPort:containerPort
:配置监听地址 -p 10.0.0.100:8080:80 -
-p ip::containerPort
:随机分配端口 -p 10.0.0.100::80 -
-p hostPort:containerPort:udp
:指定协议 -p 8080:80:tcp -
-p 81:80 –p 443:443
:指定多个 - 随机映射:docker run -P (大P) 需要镜像支持
-
-
network
:运行一个容器并连接到新建的test-net
网络 -
dns=IP_ADDRESS
: 添加DNS
服务器到容器的/etc/resolv.conf
中,让容器用这个服务器来解析所有不在/etc/hosts
中的主机名 -
rm
:容器退出时自动清理容器内部的文件系统 -
-h HOSTNAME
或者--hostname=HOSTNAME
: 设定容器的主机名,它会被写到容器内的/etc/hostname
和/etc/hosts
或者:创建容器,两步走(不常用)
docker create centos:latest /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
docker start stupefied_nobel
stupefied_nobel
举个例子,比如想启动一个 ubuntu 容器, 并通过终端输出 Hello world:
执行命令如下:
docker run ubuntu:latest /bin/echo 'Hello world'
注意,上面这行命令运行容器,在输出
Hello world
后就会终止运行。如果想以交互的方式运行容器,执行如下命令:
docker run -t -i ubuntu:latest /bin/bash
参数说明:
-t: 让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上;
-i: 让容器的标准输入保持打开;
2.1.2 启动终止状态的容器
执行如下命令,可以将已经终止 (exited
)运行的容器重启。
docker container start [container ID or NAMES]
测试一波好不好使,先通过 docker ps
命令获取正在运行的容器:
假如本地有个
Redis
容器正在运行,先拿到容器 ID
或者容器名称,执行 docker stop
停止它后,再执行 docker container start
命令重启这个 Redis
容器 :
可以看到,成功重启了一个终止状态的容器。
2.1.3 Docker 重启容器
执行如下命令重启 Docker 容器:
不管容器是否启动,直接重启
docker restart [container ID or NAMES]
举个例子,比如想要重启下面的 Redis 容器:
docker
重启 redis
容器执行如下命令即可:
通过容器 ID 或者名称都可以
docker restart redis
限时 5s 关闭 redis 容器,然后重启
docker restart -t=5 redis
-t : 设置关闭容器的限制时间,若超时未能关闭,则使用 kill 命令强制关闭,默认值为 10s,这个时间用于容器保存自己的状态。
2.2 Docker查看容器
docker container ls
和docker ps
命令一样,docker container ls
查看docker
容器的命令,docker ps
查看docker
进程的命令。
结合:容器的本质就是进程
docker ps : 查看正在运行中的容器;
docker ps -a : 查看所有容器,包括运行中的、已经停止运行的容器
docker ps -l : 查看最新创建的容器,注意,只列出最后创建的容器。
docker ps -n=2: -n=2 指定列出最新创建的 2 个容器
docker container ls :查看正在运行的容器
docker container inspect 容器名称/id :查看容器详细信息/ip
返回字段说明:
-
CONTAINER ID
: 容器 ID; -
IMAGE
: 创建容器时使用的镜像; -
COMMAND
: 容器最后运行的命令; -
CREATED
: 容器创建时间; -
STATUS
: 容器状态; -
PORTS
: 端口信息; -
NAMES
: 容器名:和容器 ID 一样,可以标识容器的唯一性,同一台宿主机上不允许有同名容器存在,否则会冲突;
2.3 Docker 进入容器
要想进入到已运行的 Docker
容器,主要有如下两种方式:
- 使用
docker exec
命令; - 使用
docker attach
命令;
2.3.1 exec 命令(推荐)
Docker
在 1.3.X 版本后开始支持 exec
命令进入容器,命令如下:
docker exec -it [container ID or NAMES]
举个例子,比如想进入到本地的 Redis 容器中:
Docker
准备进入 redis
容器可以通过容器
ID
或者名称进入容器:
docker exec -it redis /bin/bash
docker
通过 exec
命令进入到容器后,要想退出容器,只需键入 exit
命令回车即可:
(base) ➜ ~ docker exec -it redis /bin/bash
root@023d93457910:/data#
root@023d93457910:/data#
root@023d93457910:/data#
root@023d93457910:/data# exit
exit
注意
:exec
命令和下面 attach
命令的区别在于,当使用 exit
退出容器时,不会导致容器停止。
2.3.2 attach 命令
attach进入容器,使用pts/0 ,会让所用通过此方法进如放入用户看到同样的操作。
执行命令格式如下:
docker attach [container ID or NAMES]
注意
:这种方式在执行 exit
命令退出容器时,会导致容器停止运行。
2.4 Docker 停止&关闭容器
有以下两种方式关闭一个正在运行的 Docker
容器:
2.4.1 stop 优雅模式
docker container stop [container ID or NAMES]
简写模式(可省略关键字 container )
docker stop [container ID or NAMES]
举个例子,比如想要停止下图中的 Ubuntu 容器:
docker
停止关闭 ubuntu
容器通过容器 ID 或者容器名称都可以停止容器,命令如下:
通过容器 ID 关闭容器
docker stop 4e6fc78cc0c4
2.4.2 kill 强制模式
kill
命令强制关闭容器:
docker container kill [container ID or NAMES]
简写模式(可省略关键字 container )
docker kill [container ID or NAMES]
2.4.3 关闭交互形式运行容器
对于交互形式运行的容器如何关闭
前面说到的交互形式运行的容器,可以通过输入exit
或者 Ctrl+d
退出容器。
2.4.4 查看已经停止运行的容器
执行如下命令,可以看到那些已经停止运行的容器:
docker container ls -a
查看
docker
已经停止运行的容器想要重启已经停止运行的容器,命令如下:
docker container start [container ID or NAMES]
另外,docker container restart
命令会将一个已经运行中的容器重新启动。
2.5 Docker 导出&导入容器
2.5.1 导出容器
使用 docker export
命令可以导出容器,比如想导出下面的 Redis
容器:
查看本地的 docker
容器
docker export 9e8d11aeef0c > redis.tar
导出的 tar 包快照存于当前目录下
2.5.2 导入容器快照
使用 docker import
命令可以将快照导入为镜像,例如:
cat redis.tar | docker import - test/redis:v1.0
导入成功后,就可以看到新生成的镜像了:
除了通过快照的方式导入容器,还可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
2.6 Docker 删除容器
执行如下命令可以删除一个已经停止运行的容器:
docker container rm [container ID or NAMES]
简写模式(可省略关键字 container )
docker rm [container ID or NAMES]
举个例子,比如想要删除下面的 Redis 容器:
执行如下命令即可:
通过容器 ID 删除
docker rm 023d93457910
2.6.1 强制删除容器
添加 -f
参数可强制删除一个正在运行的容器:
docker
查看正在运行的容器如图示,强制删除这个
Redis
容器:
通过容器 ID 强制删除容器
docker rm -f 207aaf2e3384
2.6.2 删除所有已经停止运行的容器
如何一次性删除所有已经停止的容器
用 docker container ls -a
命令可以查看所有已经创建的包括停止运行的容器,如果数量太多要一个个删除会很麻烦,执行如下命令即可删除掉所有已经停止运行的容器:
docker container prune
转载于:https://mp.weixin.qq.com/s/v4irskK_uXgsnLe2FUoTLw
2.7 Docker连接
Docker
容器互联,端口映射并不是唯一把 docker
连接到另一个容器的方法。docker
有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker
连接会创建一个父子关系,其中父容器可以看到子容器的信息。
2.7.1 容器命名
当我们创建一个容器的时候,docker
会自动对它进行命名。另外,我们也可以使用 --name
标识来命名容器,例如:
runoob@runoob:~$ docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
我们可以使用 docker ps 命令来查看容器名称。
runoob@runoob:~$ docker ps -l
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
43780a6eabaa training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp runoob
2.7.2 新建网络
下面先创建一个新的 Docker 网络。
$ docker network create -d bridge test-net
参数说明:
-
d
:参数指定Docker
网络类型,有 bridge、overlay。
点击了解更多关于docker容器网络信息
2.7.3 连接容器
运行一个容器并连接到新建的 test-net
网络:
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
打开新的终端,再运行一个容器并加入到 test-net 网络:
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
点击图片查看大图:
下面通过 ping
来证明 test1 容器和 test2 容器建立了互联关系。
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping
apt-get update
apt install iputils-ping
这样,test1 容器和 test2 容器建立了互联关系。
如果有多个容器之间需要互相连接,推荐使用 Docker Compose
2.7.4 apt和apt-get区别
由于镜像是基于Ubuntu操作系统构建的,因此需要知道这俩个命令区别
随着 apt install package
命令的使用频率和普遍性逐步超过 apt-get install package
,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt
而不是 apt-get
在使用 apt
命令时,用户不必再由 apt-get
转到 apt-cache
或 apt-config
,而且 apt
更加结构化,并为用户提供了管理软件包所需的必要选项。
简单来说就是:apt = apt-get、apt-cache 和 apt-config
中最常用命令选项的集合。
通过 apt
命令,用户可以在同一地方集中得到所有必要的工具,apt
的主要目的是提供一种以让终端用户满意
的方式来处理 Linux
软件包的有效方式。
apt
具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。除此之外,它默认启用的几个特性对最终用户也非常有帮助。例如,可以在使用 apt
命令安装或删除程序时看到进度条
虽然 apt
与 apt-get
有一些类似的命令选项,但它并不能完全向下兼容 apt-get
命令。也就是说,可以用 apt
替换部分 apt-get
系列命令,但不是全部
apt 命令 | 取代的命令 | 命令的功能 |
---|---|---|
apt install | apt-get install | 安装软件包 |
apt remove | apt-get remove | 移除软件包 |
apt purge | apt-get purge | 移除软件包及配置文件 |
apt update | apt-get update | 刷新存储库索引 |
apt upgrade | apt-get upgrade | 升级所有可升级的软件包 |
apt autoremove | apt-get autoremove | 自动删除不需要的包 |
apt full-upgrade | apt-get dist-upgrade | 在升级软件包时自动处理依赖关系 |
apt search | apt-cache search | 搜索应用程序 |
apt show | apt-cache show | 显示装细节 |
当然,apt 还有一些自己的命令:
新的apt命令 | 命令的功能 |
---|---|
apt list | 列出包含条件的包(已安装,可升级等) |
apt edit-sources | 编辑源列表 |
2.7.5 配置DNS
我们可以在宿主机的 /etc/docker/daemon.json
文件中增加以下内容来设置全部容器的 DNS:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8
查看容器的 DNS
是否生效可以使用以下命令,它会输出容器的 DNS 信息:
$ docker run -it --rm ubuntu cat etc/resolv.conf
手动指定容器的配置
如果只想在指定的容器设置 DNS
,则可以使用以下命令:
$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
参数说明:
-
rm
:容器退出时自动清理容器内部的文件系统。 -
h HOSTNAME
或者--hostname=HOSTNAME
:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。 -
dns=IP_ADDRESS
: 添加DNS
服务器到容器的/etc/resolv.conf
中,让容器用这个服务器来解析所有不在/etc/hosts
中的主机名。 -
dns-search=DOMAIN
: 设定容器的搜索域,当设定搜索域为.example.com
时,在搜索一个名为host
的主机时,DNS
不仅搜索host
,还会搜索host.example.com
注意
:如果没有指定,则 Docker
会默认用宿主主机上的 /etc/resolv.conf
来配置容器的 DNS
2.8 使用docker运行zabbix-server
2.8.1 容器间的互联
在运行zabbix
之前务必要了解容器间互联的方法
创建一个nginx容器
docker run -d -p 80:80 nginx
创建容器,做link,并进入容器中
docker run -it --link quirky_brown:web01 centos-ssh /bin/bash
在容器中访问nginx容器可以ping通
ping web01
命令执行过程
启动apache容器
[root@docker01 ~]# docker run -d httpd:2.4
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f1f7fc55472 httpd:2.4"httpd-foreground"6 seconds ago Up 5 seconds 80/tcp determined_clarke
拉取一个busybox 镜像
[root@docker01 ~]# docker pull busybox
启动容器
[root@docker01 ~]# docker run -it --link determined_clarke:web busybox:latest /bin/sh
/ #
# 使用新的容器访问最初的web容器
/ # ping web
PING web (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms
^C
--- web ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.058/0.058/0.058 ms
2.8.2 启动zabbix容器
1、启动一个mysql的容器
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
2、启动java-gateway容器监控java服务
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
3、启动zabbix-mysql容器使用link连接mysql与java-gateway
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
2.8.3 关于zabbix API
关于zabbix API可以参考官方文档:https://www.zabbix.com/documentation/3.4/zh/manual/api
获取token方法
# 获取token
[root@docker02 ~]# curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "test"
},
"id": 1
}' http://10.0.0.100/api_jsonrpc.php
{"jsonrpc":"2.0","result":"d3be707f9e866ec5d0d1c242292cbebd","id":1}