1、Docker安装
在Rocky8上,可以先配置对应版本的yum仓库,然后使用yum工具安装Docker
- 1)先安装yum-utils工具
yum install -y yum-utils
- 2)配置Docker官方的yum仓库
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
- 可以使用国内镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
- 3)查看Docker版本
yum list docker-ce --showduplicates | sort -r
- 4)安装指定版本Docker
yum install docker-ce-20.10.9-3.el8
#如果不指定版本,就安装最新版
yum install docker-ce
- 5)启动服务
systemctl start docker
systemctl enable docker
2、Docker镜像与容器
Docker镜像拉取下来后,可以直接运行,运行后的东西我们叫做容器,一个镜像可以启动很多容器。
容器就是镜像启动后的状态,在Linux系统里看就是一个进程,但容器是可以进入得,就像进入了一个虚拟机里。
- 1)配置加速器
编写/etc/docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
加速链接需要去阿里云官网申请
地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- daemon.json参数
{
"api-cors-header":"",
"authorization-plugins":[],
"bip": "",
"bridge":"",
"cgroup-parent":"",
"cluster-store":"",
"cluster-store-opts":{},
"cluster-advertise":"",
"debug": true, #启用debug的模式,启用后,可以看到很多的启动信息。默认false
"default-gateway":"",
"default-gateway-v6":"",
"default-runtime":"runc",
"default-ulimits":{},
"disable-legacy-registry":false,
"dns": ["192.168.1.1"], # 设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看。
"dns-opts": [], # 容器 /etc/resolv.conf 文件,其他设置
"dns-search": [], # 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS不仅搜索host,还会搜
索host.example.com 。 注意:如果不设置, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
"exec-opts": [],
"exec-root":"",
"fixed-cidr":"",
"fixed-cidr-v6":"",
"graph":"/var/lib/docker", #已废弃,使用data-root代替,这个主要看docker的版本
"data-root":"/var/lib/docker", #Docker运行时使用的根路径,根路径下的内容稍后介绍,默认/var/lib/docker
"group": "", #Unix套接字的属组,仅指/var/run/docker.sock
"hosts": [], #设置容器hosts
"icc": false,
"insecure-registries": [], #配置docker的私库地址
"ip":"0.0.0.0",
"iptables": false,
"ipv6": false,
"ip-forward": false, #默认true, 启用 net.ipv4.ip_forward ,进入容器后使用 sysctl -a | grepnet.ipv4.ip_forward 查看
"ip-masq":false,
"labels":["nodeName=node-121"], # docker主机的标签,很实用的功能,例如定义:–label nodeName=host-121
"live-restore": true,
"log-driver":"",
"log-level":"",
"log-opts": {},
"max-concurrent-downloads":3,
"max-concurrent-uploads":5,
"mtu": 0,
"oom-score-adjust":-500,
"pidfile": "", #Docker守护进程的PID文件
"raw-logs": false,
"registry-mirrors":["xxxx"], #镜像加速的地址,增加后在 docker info中可查看。
"runtimes": {
"runc": {
"path": "runc"
},
"custom": {
"path":"/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
},
"selinux-enabled": false, #默认 false,启用selinux支持
"storage-driver":"",
"storage-opts": [],
"swarm-default-advertise-addr":"",
"tls": true, #默认 false, 启动TLS认证开关
"tlscacert": "", #默认 ~/.docker/ca.pem,通过CA认证过的的certificate文件路径
"tlscert": "", #默认 ~/.docker/cert.pem ,TLS的certificate文件路径
"tlskey": "", #默认~/.docker/key.pem,TLS的key文件路径
"tlsverify": true, #默认false,使用TLS并做后台进程与客户端通讯的验证
"userland-proxy":false,
"userns-remap":""
}
重启docker服务
systemctl restart docker
检查是否生效
docker info |grep -A 3 'Registry Mirrors'
- docker info参数
Containers: 45 #容器的数量
Running: 44 #正在运行的数量
Paused: 0 #暂停的数量
Stopped: 1 #已经停止的数量
Images: 264 #镜像数量
Server Version: 1.12.5 #docker server的版本
Storage Driver: devicemapper #存储驱动程序
Pool Name: docker-253:0-537427328-pool #pool name的值根据Data file的模式改变 # direct-lvm 模式(Pool Name 为 docker-thinpool )
Pool Blocksize: 65.54 kB #pool块大小
Base Device Size: 10.74 GB #基本存储大小
Backing Filesystem: xfs #支持的文件系统
Data file: /dev/loop0 #使用的模式为loop-lvm 生产中不推荐使用(loop-lvm性能比较差) 使用 direct-lvm 模式(配置过程在最后面)
Metadata file: /dev/loop1 #元数据文件位置
Data Space Used: 86.78 GB #数据使用的空间 direct-lvm 模式 direct-lvm 模式
Data Space Total: 107.4 GB #数据的总空间
Data Space Available: 20.6 GB #数据的可用空间
Metadata Space Used: 159.8 MB #元数据使用的空间
Metadata Space Total: 2.147 GB #元数据的总空间
Metadata Space Available: 1.988 GB #元数据的可用空间
Thin Pool Minimum Free Space: 10.74 GB # Thin pool(瘦供给池)的最小可用空间 *下面有瘦供给的解释
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /var/lib/docker/devicemapper/devicemapper/data #数据loop文件的位置
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device. #警告信息
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata #元数据loop文件的位置
Library Version: 1.02.135-RHEL7 (2016-09-28)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: #插件
Volume: local
Network: host null bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp #内核安全组件
Kernel Version: 3.10.0-514.el7.x86_64 #内核版本
Operating System: CentOS Linux 7 (Core) #操作系统
OSType: linux #操作系统类型
Architecture: x86_64 #系统架构
CPUs: 4 #CPU数
Total Memory: 30.96 GiB #总空间
Name: docker-slave3.ctrm #主机名
ID: POZH:PSTG:ULR2:S75Y:OW57:ETGA:Z7RU:WEQA:VGNE:4JMJ:PJ3N:LXZW
Docker Root Dir: /var/lib/docker #docker根目录
Debug Mode (client): false #调试模式(client)
Debug Mode (server): false #调试模式(server)
Registry: https://index.docker.io/v1/ #镜像仓库
Insecure Registries: #非安全镜像仓库
15.116.20.134:5000
15.116.20.104:80
15.116.20.115:80
127.0.0.0/8
- 2)拉取镜像
docker pull busybox ##这个busybox就是系统镜像名字,它是从hub.docker.com去拉取镜像
- 3)查看当前系统镜像
docker image ls
或
docker images
- 4)搜索镜像
docker search ubuntu
如果要查询镜像版本,可以访问https://hub.docker.com/,搜索对应的镜像名字,然后点tag进行查看
拉取指定版本镜像
docker pull nginx:1.23.2
- 5)给镜像打标签
docker tag busybox:latest aminglinux:1.2.3
- 6)启动容器
docker run -itd busybox ##把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
- 7)查看容器
docker ps -a ##如果不加-a,则不显示已经停止的容器
- 8)停止容器
docker stop de1fb9c8902e ##后面这一串字符串为容器ID,可以通过docker ps查看
可以通过start启动容器
docker start de1fb9c8902e
可以通过restart重启容器
docker restart de1fb9c8902e
- 9)删除容器
docker rm de1fb9c8902e ##如果容器未停止,会报错,需要加-f选项
- 10)删除镜像
docker rmi aminglinux:1.2.3 ##这里因为aminglinux:1.2.3为busybox的一个tag,所以此操作只会删除此tag,并不会真正删镜像,如果该镜像没有tag,则直接删除镜像
也可以直接指定镜像ID
docker rmi beae173ccac6
- 11)拉取镜像+启动容器
docker run -itd redis
- 12)启动容器时,给容器自定义名字
docker run --name web01 -itd ubuntu
- 13)容器运行后直接退出并删除
docker run --rm -it ubuntu bash -c "sleep 30"
- 14)进入容器操作
docker exec -it web01 bash
进去后,相当于进入了一个虚拟机一样,安装个nginx
apt update
apt install -y nginx
- 15)将容器重新打包成新镜像
docker commit -m "install nginx" -a "aming" web01 nginx_ubuntu:1.0 ##这里的web01可以改为容器id
再次查看镜像列表,发现多了一个nginx_ubuntu:1.0
- 16)将镜像保存为一个文件
docker save nginx -o nginx.img
- 17)将导出的镜像文件导入
docker load --input nginx.img
- 18)将容器导出为一个文件
docker export web01 > web01.tar
- 19)将导出的文件导入为新的镜像
docker import - ubuntu_test < web01.tar
- 20)docker save和docker export的差异
docker save保存的是镜像,docker export保存的是容器
docker save会保留镜像所有的历史记录,docker export不会,即没有commit历史
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
3、Docker的数据持久化
- 1)将本地目录映射到容器里
mkdir -p /data/
docker run -tid -v /data/:/data ubuntu bash ## -v 用来指定挂载目录 :前面的/data/为宿主机本地目录 :后面的/data/为容器里的目录,会在容器中自动创建
可以在/data/里创建一个文件
echo "hello" > /data/1.txt
然后到容器里查看
docker exec -it c82a5a00ae68 bash -c "cat /data/1.txt"
- 2)数据卷
创建数据卷
docker volume create testvol ##testvol为数据卷名字
列出数据卷
docker volume ls
查看数据卷信息
docker volume inspect testvol
使用数据卷
docker run -itd --name aming01 -v testvol:/data/ ubuntu ##和前面直接映射本地目录不同,冒号左边为数据卷名字
多个容器共享一个数据卷
docker run -itd --name aming02 -v testvol:/data/ ubuntu
- 3)将宿主机上的文件快速传输进容器里
docker cp /etc/fstab aming01:/tmp/test.txt
docker exec -it aming01 cat /tmp/test.txt
4、Docker网络
Docker服务启动时会生成一个docker0的网卡,这个网卡是实现容器网络通信的根本。 默认容器使用的网络类型为桥接(bridge)模式,这个桥接和我们的vmware里的桥接可不是一回事。它更像是vmware的NAT模式。
每启动一个容器,都会产生一个虚拟网卡 vethxxx
iptables -nvL -t nat ##可以看到DOCKER相关规则,容器之所以可以联网,是靠这些规则实现的
Docker网络模式 | 配置 | 说明 | 应用场景 |
---|---|---|---|
host模式 | –-net=host | 容器和宿主机共享Network namespace。 | 这种模式性能很高,适合需要容器与主机无延迟通信的场景。在拓扑中,容器直接连接到主机的网络,就像是主机的一部分。 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 | 这种模式在需要多个容器之间的紧密通信和隔离的场景中很有用。在拓扑中,多个容器共享一个容器的网络栈。 |
none模式 | –-net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 | 这种模式在安全性要求非常高的环境下使用,容器内部无法与外部网络通信。在拓扑中,容器与外部隔绝。 |
bridge模式 | –-net=bridge | (默认为该模式) | 这种模式适用于在单个主机上运行多个容器,容器之间可以通过桥接器进行通信,但与主机和外部网络隔离。在拓扑中,容器通过虚拟网络桥接器连接到主机的网络。 |
- 1)host模式
docker run -itd --net=host --name aming03 ubuntu
可以进入容器内,查看hostname,查看ip地址。 这种模式,容器和宿主机共享主机名、IP。
- 2)container模式
该模式下,在启动容器时,需要指定目标容器ID或者name,意思是将要启动的容器使用和目标容器一样的网络,即它们的IP一样
docker run -itd --net=container:/aming01 --name aming04 ubuntu
可以进入容器查看aming01和aming04的网络情况
- 3)none模式
即不需要配置网络
docker run -itd --net=none --name=aming05 ubuntu_test bash
查看:
docker exec -it aming05 bash -c "ip add"
- 4)bridge模式
也就是默认模式,可以–net=bridge 也可以不指定–net,默认就是bridge - 5)端口映射
docker run -itd -v /data/:/var/www/html/ -p 8088:80 --name aming06 ubuntu_test bash
说明: -p后面跟 宿主机监听端口:容器监听端口
5、Dockerfile
是实现自定镜像的一种手段,通过编写Dockerfile,来编译成自己想要的镜像。
5.1 Dockerfile格式
1、FROM 指定基于哪个基础镜像,如下:
FROM ubuntu:latest
2、MAINTAINER 指定作者信息,如下:
MAINTAINER aming aming@aminglinux.com
3、RUN 后面跟具体的命令
RUN apt install -y curl
也可以写成如下内容,相对比较复杂
RUN ["apt","install","-y","curl" ]
4、CMD 用来指定容器启动时用到的命令,只能有一条命令生效(如果写多个只有最后一条有效),格式如下:
CMD ["executable", "param1", "param2"]
CMD command param1 param2
CMD ["param1", "param2"]
示例如下:
CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
5、EXPOSE 指定要映射的端口,格式如下:
EXPOSE <port1> <port2> <port3>
示例-暴露22,80,8443三个端口,如下:
EXPOSE 22 80 8443
- 说明:这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。
6、ENV 为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量,如下:
ENV MYSQL_version 5.7
7、ADD 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。例如:
ADD conf/vhosts /usr/local/nginx/conf
8、COPY 类似于ADD,将本地文件拷贝到容器里,不过它不支持URL,例如:
COPY 123.txt /data/456.txt
- ADD和COPY只能使用相对路径
9、ENTRYPOINT 格式类似CMD 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。
和CMD不同是: CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。
比如,容器名字为aming 我们在Dockerfile中指定如下CMD:
CMD ["/bin/echo", "test"]
假如启动容器的命令是
docker run aming
则会输出 test
假如启动容器的命令是
docker run -it aming /bin/bash
则什么都不会输出
ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行
ENTRYPOINT ["echo", "test"]
假如启动容器的命令是
docker run -it aming 123
则会输出 test 123 ,这相当于要执行命令 echo test 123
10、VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点
VOLUME ["/data"]
11、USER指定RUN、CMD或者ENTRYPOINT运行时使用的用户
USER aming
12、WORKDIR 为后续的RUN、CMD或者ENTRYPOINT指定工作目录
WORKDIR /tmp/
5.2 Dockerfile示例
下面通过使用Dockerfile编译nginx镜像:
1、创建工作目录
$ mkdir dockerfile_test
$ cd dockerfile_test
2、编写Dockerfile文件
$ vim Dockerfile
FROM ubuntu
MAINTAINER axing axing@zhoumx.net
RUN apt update
RUN apt install -y libpcre2-dev net-tools gcc zlib1g-dev make
ADD http://nginx.org/download/nginx-1.23.2.tar.gz .
RUN tar zxvf nginx-1.23.2.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.23.2 && ./configure --prefix=/usr/local/nginx && make && make install
COPY index.html /usr/local/nginx/html/index.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;"
- -g “daemon off”目的是让nginx在前台运行
- 容器特性:在容器环境,one container == one process,容器要能持续运行,必须有一个前台进程,nginx默认是以守护进程来运行的(daemon on),在后台默默提供服务,需要将nginx转为前台进程( daemon off);如果启动命令在后台运行,这个容器会终止。
3、创建index.html文件
$ cd dockerfile_test
$ echo "test" > index.html
4、编译镜像
$ docker build -t nginx:0.9 .
说明: -t 后面跟镜像名字:tag, 这里的. 表示使用当前目录下的Dockerfile,并且工作目录也为当前目录,如果想使用其它目录下的Dockerfile,还可以使用-f选项来指定,例如
$ docker build -t nginx:1.0 -f /data/docker/nginx.dkf /tmp/
上面参数说明如下:
- /tmp/:工作目录,比如COPY文件的时候,到/tmp/下面去找
5、使用镜像
$ docker run -itd --name nginx01 -P nginx:0.9
因为是-P,端口随机分配,使用docker ps
命令查看,容器80端口映射到49153(指定具体端口要用-p)
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec29e68bfca9 nginx:0.9 "/bin/sh -c '/usr/lo…" 4 seconds ago Up 3 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01
6、验证
$ curl localhost:49153/index.html
test
6、docker-compose
Docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。
我们可以在一个compose文件中定义一个多容器的应用(比如wordpress),然后通过该compose来启动这个应用。
6.1 docker-compose安装
1、点击官网地址,选择需要的版本进行下载安装

2、下载完上传到机器的/usr/local/bin/目录下,给文件更名赋权
$ mv docker-compose-linux-x86_64 docker-compose
$ chmod a+x /usr/local/bin/docker-compose
网络允许的情况可以通过命令下载
$ curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose
3、测试并查看版本
$ docker-compose version
6.2 docker-compose部署
1、编辑wordpress的compose yaml文件
$ vim docker-compose.yml
services:
db: # 服务1:db
image: mysql:5.7 # 使用镜像 mysql:5.7版本
volumes:
- db_data:/var/lib/mysql # 数据持久化
restart: always # 容器服务宕机后总是重启
environment: # 环境配置
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress: # 服务2:wordpress
depends_on: # wordpress服务启动时依赖db服务,所以会自动先启动db服务
- db
image: wordpress:latest # 使用镜像 wordpress:latest最新版
ports:
- "8000:80" #端口映射8000:80
restart: always
environment: # 环境
WORDPRESS_DB_HOST: db:3306 # wordpress连接db的3306端口
WORDPRESS_DB_USER: wordpress # wordpress的数据库用户为wordpress
WORDPRESS_DB_PASSWORD: wordpress # wordpress的数据库密码是wordpress
WORDPRESS_DB_NAME: wordpress # wordpress的数据库名字是wordpress
volumes:
db_data: {}
2、启动
$ docker-compose up -d
上面参数说明:
- d:表示后台启动
3、查看
$ docker-compose ps
4、停止
$ docker-compose stop
- 使用docker-compose管理容器或容器组,需要进入存放docker-compose.yml文件目录下执行