Docker的自动化安装
Docker官方和国内daocloud都提供了一键安装的脚本,使得Docker的安装更加便捷。
官方的一键安装方式:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
国内 daocloud一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
执行上述任一条命令,耐心等待即可完成Docker的安装。
手动安装
首先在该网站下载对应的版本,然后将包传到机器里
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
[root@localhost ~]# rz -E
rz waiting to receive.
[root@localhost ~]# ls
anaconda-ks.cfg
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
安装
[root@localhost ~]# yum -y install docker-ce*
设置开机自启并重启
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# reboot
###之所以重启
Docker 会利用netfilter组件实现数据报文的转发,重启之后Docker会和netfilter配合的更加稳定
Docker 加速配置
[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://hub-mirror.c.163.com
[root@localhost ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://hub-mirror.c.163.com"]}
指配置的镜像地址在哪,由他帮我们加速
测试Docker是否安装成功
[root@localhost ~]# docker run hello-world
![](https://i-blog.csdnimg.cn/blog_migrate/db58af2e15fa89b0f0b392fd42b665eb.png)
docker镜像下载
网易镜像仓库:镜像中心 - 网易云镜像中心 (163yun.com)
![](https://i-blog.csdnimg.cn/blog_migrate/a410341e5b92a66d2f029f2f0f88b324.png)
Docker管理
Docker 基础概念及命令
Docker 三个重要概念:仓库 (Repository)、镜像 (image) 和 容器 (Container)
docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpressrun 关键字;--name 当前容器的名字;-p 映射端口;-d 放在后台运行;wordpress镜像
Docker 指令的基本用法:
docker + 命令关键字(COMMAND) + 一系列的参数
UFS:分层文件系统
Storage Driver:overlay、overlayv2、DM overlay overlayv2 >= 18.03 linuxkernel > 3.1 DM:稳定性较差
##常用命令关键字-基础命令
docker info 守护进程的系统资源设置
docker search Docker 仓库的查询
docker pull Docker 仓库的下载
docker images Docker 镜像的查询
docker rmi Docker 镜像的删除
docker ps 容器的查询
docker run 容器的创建启动
docker start/stop 容器启动/停止
docker rm 容器的删除
docker save -o mysql5.7.tar mysql:5.7 将本地镜像导出
docker load -i mysql5.7.tar 导入
#查看完整id号:docker images --no-trunc
# Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用
镜像保存在:
/var/lib/docker/overlay
##单一容器管理
docker ps -a --no-trunc #查看
docker stop/start CONTAINERID #停止
docker start/stop MywordPress #通过容器别名启动/停止
docker inspect MywordPress #查看容器所有基本信息
docker logs MywordPress #查看容器日志
docker stats MywordPress #查看容器所占用的系统资源
docker exec 容器名 容器内执行的命令 #容器执行命令
docker exec -it 容器名 /bin/bash #登入容器的bash
##run基础命令
--restart=always 容器的自动启动
-h x.xx.xx 设置容器主机名
--dns xx.xx.xx.xx 设置容器使用的 DNS 服务器
--dns-search DNS 搜索设置
--add-host hostname:IP 注入 hostname <> IP 解析
--rm 服务停止时自动删除
一、常用命令关键字-基础命令
docker info 守护进程的系统资源设置
docker search Docker 仓库的查询
docker pull Docker 仓库的下载
docker images Docker 镜像的查询
docker rmi Docker 镜像的删除
docker ps 容器的查询
docker run 容器的创建启动
docker start/stop 容器启动/停止
docker rm 容器的删除
删除镜像:
[root@localhost ~]# docker rmi -f hello-world:latest
#查看完整id号:docker images --no-trunc
# Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用
镜像保存在:
/var/lib/docker/overlay
![](https://i-blog.csdnimg.cn/blog_migrate/5188e3ec59352bf40388b118774f144e.png)
docker info守护进程的系统资源设置
docker searchDocker 仓库的查询
[root@localhost ~]# docker search nginx
docker pullDocker 仓库的下载
docker imagesDocker 镜像的查询
#查看完整id号:docker images --no-trunc
docker rmiDocker镜像的删除
docker ps容器的查询
docker run容器的创建启动
docker start/stop 容器启动/停止
一个容器运行的最低要求:必须拥有一个前台进程,Docker认为如果一个容器没有前台进程就是在摸鱼,会被立即杀死。
如果不加-d则会运行在前台
![](https://i-blog.csdnimg.cn/blog_migrate/1ca64e1f161f24476c7206c7fcf9f60a.png)
换言之也就是说只有放在后台后才能正常运行
然而——
官方库,下载centos镜像对应版本:https://hub.docker.com/search?q=centos
命令:docker pull centos:centos7.9.2009
![](https://i-blog.csdnimg.cn/blog_migrate/58cef2d65f84bd138536e133f815d314.png)
则自动退出
加-d仍然没有运行
![](https://i-blog.csdnimg.cn/blog_migrate/01598930e7189fdddfd7a1c98219fde3.png)
因其运行的指令/bin/bash并不在前台
而wordpress所运行的指令是在前台的,即打开了一个tty终端,tty在前台;但/bin/bash不在前台
容器的查询 docker ps -a
查看完整id号:--no-trunc
镜像标识
1、镜像名+版本号:centos:centos7.9.2009
2、镜像ID:镜像ID 在使用的时候可以省略,只写前四位
容器标识
1、容器的ID号,可以省略,写前四位
2、容器的别名
![](https://i-blog.csdnimg.cn/blog_migrate/7e2ee3197bb5532624f5321bf6fef0e4.png)
容器的删除
docker rm 容器ID号/别名
![](https://i-blog.csdnimg.cn/blog_migrate/8e9c9bbc4bcb87c9aa2660db6547e5f1.png)
若正在运行的则无法直接删除,需加-f
Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用
docker ps -a -q 只输出当前所有容器的ID号
![](https://i-blog.csdnimg.cn/blog_migrate/acedb96016a6b3c215e39eb496e890c8.png)
docker rm -f $( docker ps -a -q ) 批量删除所有容器
同理若批量删除镜像则是: docker rmi -f $( docker images -q )
批量启动容器则是:docker start $( docker ps -a -q)
![](https://i-blog.csdnimg.cn/blog_migrate/f96754c363d7fa119a3bf7e77d28cd26.png)
写一个批量删除容器的小脚本
##后续可使用该脚本方便批量删除不用的容器
[root@localhost ~] vim /usr/local/bin/cc
#!/bin/bash
/usr/bin/docker rm-f$( /usr/bin/docker ps -a -q )
/usr/bin/docker ps-a
[root@localhost ~] chmod+x /usr/local/bin/cc
二、单一容器管理
每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示,后续对容器的启动、停止、修改、删除等所有操作,都是通过 CONTAINER ID 来完成,偏向于数据库概念中的主键
docker ps -a --no-trunc #查看
docker stop/start CONTAINERID #停止
docker start/stop MywordPress #通过容器别名启动/停止
docker inspect MywordPress #查看容器所有基本信息
docker logs MywordPress #查看容器日志
docker stats MywordPress #查看容器所占用的系统资源
docker exec 容器名 容器内执行的命令 #容器执行命令
docker exec -it 容器名 /bin/bash #登入容器的bash
#查看容器所有基本信息
创建一个容器:docker run --name test-1 -d hub.c.163.com/public/centos:7.2-tools
查看其所有信息:docker inspect test-1
[root@me ~]# docker inspect test-1
[
{
"Id": "c8f81a24d9864604124da1106b82514448c8eaaf394e594f45afc7ec97af1551",
"Created": "2023-02-14T02:20:42.813392475Z",
"Path": "/usr/bin/supervisord",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
......
......
"EndpointID": "0ecef6157475c38940d29b08d5f9d13cf752d308aaa71497a9e1049d22de2654",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
}
]
所看到的信息为JSON格式所写
常用格式为ini格式
[mysqld]
port=3306
server=127.0.0.1
[redis]
port=5601
server=127.0.0.1
JSON格式则为
{
"mysqld":{
"port": "3306",
"server": "127.0.0.1"
},
"redis":{
"port": "5601",
"server": "127.0.0.1"
}
}
命令行里查看JSON格式
安装软件jq
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum -y install jq
美化过的JSON格式
docker logs #查看容器日志
docker logs 等同于将后台的输出信息打印出来
# 查看指定时间后的日志,只显示最后100行
docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
# 查看最近30分钟的日志
docker logs --since 30m CONTAINER_ID
# 查看某时间之后的日志
docker logs -t --since="2021-08-18T11:46:37" CONTAINER_ID
# 查看某时间之后最新的100条日志
docker logs -t --since="2021-08-18T11:46:37" --tail=100 CONTAINER_ID
# 查看某时间段的日志
docker logs -t --since="2021-08-18T11:46:37" --until "2021-08-18T11:47:37" CONTAINER_ID
docker stats #查看容器所占用的系统资源
docker stats test-1
容器名 CPU使用率 内存的使用量/可用内存的总大小 内存使用百分百 网络入站/出站数据包 磁盘设备的写入/读取 进程ID
![](https://i-blog.csdnimg.cn/blog_migrate/14c2d493665a27a13828c2bb81b12658.png)
会持续刷新
# docker run --name test-3 -d hub.c.163.com/public/centos:7.2-tools
# docker run --name test-4 -d hub.c.163.com/public/centos:7.2-tools
docker stats 不加容器名则会列出所有容器
![](https://i-blog.csdnimg.cn/blog_migrate/7413f35f8aa20f1062d7c55f0adcc3f2.png)
#容器执行命令
进入容器的命令:docker exec -it centos /bin/bash
# docker run --name centos -p 8080:80 -d hub.c.163.com/public/centos:7.2-tools
并无法访问,因此容器内部并没有80端口
docker exec 容器名 容器内执行的命令
docker exec centos touch /root/mayunfei
在centos容器创建一个mayunfei的文件,↓
![](https://i-blog.csdnimg.cn/blog_migrate/db06521237fa252e6a8859ca5e535096.png)
但此命令执行起来会比较麻烦,故可——
直接进入容器里——docker exec -it centos /bin/bash
当前默认主机名为当前容器的ID号缩写
![](https://i-blog.csdnimg.cn/blog_migrate/5b71eeb55a6132e7d3f59768b68d3f41.png)
此时即可直接在内部安装Apache,而使内部有80端口,而使之可访问8080
只要外部有网络,容器内部就有
容器系统问题:
centos7:systemd 会使用D-BUS进行进程之间的通讯,D-BUS必须工作在完整的ROOT权限中,D-BUS目前只会影响systemctl start/stop/restart....等子命令。
Centos7可正常使用,因为其使用init
故在容器无法使用systemctl restart httpd 启动Apache,容器中的root只是伪root而非真root,直接使用 httpd 启动即可
![](https://i-blog.csdnimg.cn/blog_migrate/bd3157a27caeff3e942afae269a7f4a3.png)
在容器外部仍能访问到,因docker已自动配置了网桥
但是在外部则无法直接通过172.17.0.2:80在浏览器访问成功
前边已加过参数使8080端口映射为80端口,故需访问8080端口:宿主机ip:8080
![](https://i-blog.csdnimg.cn/blog_migrate/f0875dc8e95ff8ae8984164991e7d504.png)
**在容器内部使用源码包安装nginx
$ yum -y install lrzsz gcc gcc-c++ zlib zlib-devel pcre pcre-devel openssl-devel make
$ tar -zxf nginx...
$ cd nginx..
$ ./configure--prefix=/usr/lcoal/nginx
$ make && make install
$ pkill httpd
$ /usr /local/nginx/sbin/nginx
![](https://i-blog.csdnimg.cn/blog_migrate/35e0213debaee0a3a05d8b15715c816a.png)
三、run基础命令
--restart=always 容器的自动启动
-h x.xx.xx 设置容器主机名
--dns xx.xx.xx.xx 设置容器使用的 DNS 服务器
--dns-search DNS 搜索设置
--add-host hostname:IP 注入 hostname <> IP 解析
--rm 服务停止时自动删除
1.给镜像别名
docker tag #给镜像重启做别名
[root@localhost ~]# docker tag hub.c.163.com/public/centos:7.2-tools 163:latest
二者为同一文件,只不过不同名字而已
![](https://i-blog.csdnimg.cn/blog_migrate/0aa4a3bbb22d6acc4c8a0ca8e7f18d23.png)
2.--restart=always 容器的自动启动
[root@localhost ~]# docker run --name test_1 -p 8080:80 --restart=always -d 163[root@localhost ~]# docker run --name test_2 -p 8081:80 -d 163
![](https://i-blog.csdnimg.cn/blog_migrate/49d0ffc28f7b86fb41ebed6dd4cb227f.png)
模拟重启系统,即重启docker——可知test1让在运行,而test2已关闭,即test1会随着docker的启动而启动,即自启动:物理机来电自启>centos>Docker>test_1
systemctl restart docker
![](https://i-blog.csdnimg.cn/blog_migrate/bfab6449135a5fd053c4aae21d106341.png)
3.设置容器主机名
-h x.xx.xx
[root@localhost ~]# docker run --name test2 -h www.mayunfei.com -d 163
![](https://i-blog.csdnimg.cn/blog_migrate/1b0a9991619ea9f66592a1b9c55e14e4.png)
4.--add-host hostname:IP 注入 hostname <> IP 解析
docker run --name test3 --add-host www.mayunfei.com:192.168.46.101 -d 163
5.--rm 服务停止时自动删除
[root@localhost ~]# docker run --name test2 --rm -d 163
![](https://i-blog.csdnimg.cn/blog_migrate/c782d4905d6d40b7b4fe92c4d328c51d.png)
Docker-Compose
Docker-Compose容器编排工具,允许用户在一个模板( YAML 格式 )中定义一组相关联的容器,会根据 --link 等参数,对启动的优先级进行排序。
Docker 提倡理念是 “**一个容器一个进程**”,假设一个服务需要由多个进程组成,就需要多个容器组成一个系统,相互分工和配合对外提供完整服务
比如:博客系统
组件1:mariadb
组件2:WordPress 的 apache web
在启动容器时,同一台主机下如果两个容器之间需要由数据交流,使用 --link 选项建立两个容器之间的互联,前提是建立时 mariadb 已经开启
docker start db
docker start MywordPress
停止:
docker stop db MywordPress 或 docker stop MywordPress 在 docker top db
Linux 数据流三剑客:awk ;sed ;grep
Docker 三剑客:docker-Compose;docker-machine;docker-swarm(基本淘汰)
docker-compose:在单物理机中,安装多容器组建的集群
docker-machine:利用docker 技术伪真虚拟机
docker-swarm:将多个物理机组建成容器化集群
Docker-Compose下载
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
docker version
--rm 使用容器对一些项目测试,退出时自动删除容器
该命令在测试一些项目时非常好用,测试完毕退出后会自动删除镜像
[root@localhost ~]# docker run -it --rm 163 /bin/bash
![](https://i-blog.csdnimg.cn/blog_migrate/8df2bde55e68d7fac0332fb67fcc2e1d.png)
编写wordpress
1、在当前目录下创建一个docker compose配置文件
vim docker-compose.yml
#指定 docker-compose.yml 文件的版本
version: '3.3'
# 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
# 定义容器重启策略
restart: always
# 设置环境变量, environment 的值可以覆盖 env_file 的值
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
#docker-compose up 以依赖顺序启动服务,先启动db
depends_on:
- db
image: wordpress:latest
# 建立宿主机和容器之间的端口映射关系,容器的 80 端口和宿主机的 8000 端口建立映射关>系
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
# 定义容器和宿主机的卷映射关系, 其和 networks 一样可以位于 services 键的二级key和 compose 顶级key, 如果需要跨服务间使用则在顶级key定义, 在 services 中引用
volumes:
db_data: {}
2、执行命令/usr/local/bin/docker-compose up -d
在docker-compose.yml的同一个目录下执行命令/usr/local/bin/docker-compose up -d 完成服务启动。
![](https://i-blog.csdnimg.cn/blog_migrate/c077919e72d13fda6fd4d19220168eca.png)
3、访问
访问http://<linux宿主机服务器>:8000 。
同样使用mysql客户端,可以访问该宿主机的3306端口,查看数据库数据。
![](https://i-blog.csdnimg.cn/blog_migrate/6394f2342c37efa0f200cf979d9a2f67.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d4ea14077e4c0f45b8dae30eec234a36.png)