文章目录
1、docker容器简介
优点:
1、管理方便
2、成本低廉
3、颗粒度更小,可以更好的控制资源让物理机更加饱和的运行
2、安装docker
在Ubuntu中安装docker:
1、查看Ubuntu版本和卸载相关docker软件
root@root:/home/north# cat /etc/issue
Ubuntu 22.04.1 LTS \n \l
root@root:/home/north# sudo apt-get remove docker docker-engine docker.io containerd runc
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-engine
2、设置存储库更新仓库资源
root@root:/home/north# apt-get update
Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease [108 kB]
Get:4 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:5 http://cn.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [618 kB]
Get:6 http://cn.archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [173 kB]
Get:7 http://cn.archive.ubuntu.com/ubuntu jammy-updates/main amd64 c-n-f Metadata [14.6 kB]
Get:8 http://cn.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [279 kB]
Get:9 http://cn.archive.ubuntu.com/ubuntu jammy-updates/restricted Translation-en [41.2 kB]
Get:10 http://cn.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 c-n-f Metadata [604 B]
Get:11 http://cn.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [902 kB]
Get:12 http://cn.archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [186 kB]
Get:13 http://cn.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 c-n-f Metadata [19.0 kB]
Get:14 http://cn.archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 Packages [35.3 kB]
Get:15 http://cn.archive.ubuntu.com/ubuntu jammy-updates/multiverse Translation-en [8,452 B]
Get:16 http://cn.archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 c-n-f Metadata [468 B]
Get:17 http://cn.archive.ubuntu.com/ubuntu jammy-backports/main amd64 Packages [40.9 kB]
Get:18 http://cn.archive.ubuntu.com/ubuntu jammy-backports/main Translation-en [10.2 kB]
Get:19 http://cn.archive.ubuntu.com/ubuntu jammy-backports/main amd64 c-n-f Metadata [388 B]
Get:20 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [23.4 kB]
Get:21 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe Translation-en [15.0 kB]
Get:22 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 c-n-f Metadata [548 B]
Get:23 http://cn.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages [403 kB]
Get:24 http://cn.archive.ubuntu.com/ubuntu jammy-security/main Translation-en [114 kB]
Get:25 http://cn.archive.ubuntu.com/ubuntu jammy-security/main amd64 c-n-f Metadata [9,880 B]
Get:26 http://cn.archive.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [279 kB]
Get:27 http://cn.archive.ubuntu.com/ubuntu jammy-security/restricted Translation-en [40.8 kB]
Get:28 http://cn.archive.ubuntu.com/ubuntu jammy-security/restricted amd64 c-n-f Metadata [604 B]
Get:29 http://cn.archive.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [723 kB]
Get:30 http://cn.archive.ubuntu.com/ubuntu jammy-security/universe Translation-en [127 kB]
Get:31 http://cn.archive.ubuntu.com/ubuntu jammy-security/universe amd64 c-n-f Metadata [14.7 kB]
Get:32 http://cn.archive.ubuntu.com/ubuntu jammy-security/multiverse amd64 Packages [30.2 kB]
Get:33 http://cn.archive.ubuntu.com/ubuntu jammy-security/multiverse Translation-en [5,828 B]
Get:34 http://cn.archive.ubuntu.com/ubuntu jammy-security/multiverse amd64 c-n-f Metadata [252 B]
Fetched 4,453 kB in 19s (240 kB/s)
Reading package lists... Done
root@root:/home/north#
3、安装需要的软件
root@root:/home/north# apt-get install ca-certificates curl gnupg
4、添加Docker的官方GPG密钥
root@root:/home/north# sudo install -m 0755 -d /etc/apt/keyrings
root@root:/home/north# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
root@root:/home/north# sudo chmod a+r /etc/apt/keyrings/docker.gpg
root@root:/home/north#
5、使用以下命令设置存储库,仓库文件docker去哪里下载:
root@root:/home/north# echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
root@root:/home/north#
6、再次更新系统仓库,可以让我们系统知道
root@root:/home/north# sudo apt-get update
Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]
Get:4 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [18.7 kB]
Get:5 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease [108 kB]
Get:6 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:7 http://cn.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [618 kB]
Get:8 http://cn.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [902 kB]
Fetched 1,925 kB in 7s (289 kB/s)
Reading package lists... Done
7、安装docker、启动docker
root@root:/home/north# sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
root@root:/home/north# service docker start
root@root:/home/north# ps aux|grep docker
root 8421 3.0 3.8 1466812 75608 ? Ssl 08:23 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 8559 0.0 0.1 6476 2340 pts/0 S+ 08:23 0:00 grep --color=auto docker
设置开机启动:
root@root:/home/north# systemctl enable docker
8、安装问题
在更新存储库是使用的镜像可能会出错,可以配置国内的镜像源
使用的Ubuntu版本尽量是docker支持的版本不然可能会出错
在CentOS中安装docker:
1、删除旧的相关版本软件依赖
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
> docker-engine
[root@docker_server ~]# sudo yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
2、设置Docker的存储库
[root@docker_server ~]# sudo yum install -y yum-utils
[root@docker_server ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
3、安装docker、启动docker
[root@docker_server ~]# sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[root@docker_server ~]# service docker start
Redirecting to /bin/systemctl start docker.service
[root@docker_server ~]# ps aux|grep docker
root 1957 3.0 2.7 1186288 50380 ? Ssl 17:23 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 2104 0.0 0.0 112824 980 pts/0 S+ 17:23 0:00 grep --color=auto docker
设置开机启动:
[root@docker_server ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@docker_server ~]#
2、docker使用
1、docker的底层隔离机制
namespace(命名空间):内存中的一块空间,里面存放数据;将资源隔离开
LXC(Linux Containers):基于容器的操作系统层级的虚拟化技术;可以为进程提供虚拟的执行环境,一个虚拟的执行环境就是一个容器。个人觉得它像一个统筹者。
Control Groups(cgroups):对资源进行限制,例如cpu、内存、磁盘等
2、启动mySQL容器
[root@docker_server ~]# docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD='123456' -p 33060:3306 -d mysql:5.7.42
5986cdde0aaae9270ee48d0162098af02f78c75048c426b0fdb8684279f3d8cb
[root@docker_server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5986cdde0aaa mysql:5.7.42 "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 33060/tcp, 0.0.0.0:33060->3306/tcp, :::33060->3306/tcp sc-mysql-1
[root@docker_server ~]# netstat -anplut | grep 3306
tcp 0 0 0.0.0.0:33060 0.0.0.0:* LISTEN 3744/docker-proxy
tcp6 0 0 :::33060 :::* LISTEN 3751/docker-proxy
容器内部登录mysql:
[root@docker_server ~]# docker exec -it sc-mysql-1 /bin/bash
bash-4.2# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
bash-4.2# mysql -uroot -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.42 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit
Bye
bash-4.2# exit
exit
[root@docker_server ~]#
远程登录:
可以使用Navicat、SQLyog进行连接
注意端口为暴露端口
3、镜像的导入导出
镜像导出:
静态(存放的镜像):docker save -o nginx.tar nginx
动态(运行在容器的):docker export -o nginx.tar nginx
[root@docker_server ~]# docker save -o nginx.tar nginx
[root@docker_server ~]# ls
anaconda-ks.cfg nginx.tar
镜像导入:
docker load -i nginx.tar
docker import nginx.tar nginx:1.23.1
4、常用命令
docker run 的使用:
docker run :创建一个新的容器并运行一个命令
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a, --attach=[] 登录容器(以docker run -d启动的容器)
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
--cap-add=[] 添加权限,权限清单...
--cap-drop=[] 删除权限,权限清单...
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d, --detach=false 指定容器运行于前台还是后台
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
-h, --hostname="" 指定容器的主机名
-i, --interactive=false 打开STDIN,用于控制台交互
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
-m, --memory="" 指定容器的内存上限
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置,待详述
-P, --publish-all=false 指定容器暴露的端口,待详述
-p, --publish=[] 指定容器暴露的端口,待详述
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="" 指定容器停止后的重启策略,待详述
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-t, --tty=false 分配tty设备,该可以支持终端登录
-u, --user="" 指定容器的用户
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
-w, --workdir="" 指定容器的工作目录
查找、拉取镜像、运行、停止:
docker search name
docker pull 镜像名:版本
docker start name
docker stop name
查看容器的信息、状态:
docker inspect name
docker stats
列出本地镜像、容器
docker images
docker ps -a
查看日志:
docker logs
-f : 跟踪日志输出
–since :显示某个开始时间的所有日志
-t : 显示时间戳
–tail :仅列出最新N条容器日志
在运行的容器中执行命令:
docker exec
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
[root@docker_server ~]# docker exec -it sc-nginx-1 bash
root@2a91970ee342:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
5、微服务(IaaS、PaaS、SaaS、BaaS)
B2B:企业对企业
B2C:企业对用户
IaaS:基础设施及服务,卖基础设施、云服务器
PaaS:平台及服务,提供组件服务(如存储、cdn、直播等)
SaaS:提供软件服务
BaaS:卖区块链服务
6、数据共享-卷的使用
卷:docker中容器存储数据的地方
[root@ali_server volumes]# docker inspect sc-mysql-1|grep volume
"Type": "volume",
"Source": "/var/lib/docker/volumes/74dc72c8d1bf67ccf538a22f8c8335e613ceb0577503ca7d782d01d02c3e19bb/_data",
[root@ali_server volumes]# ls
08431bc5c0c0242445ba27b8d2fc00b2cf49bde51449edecbd12f5e19d13e4b4 a9dbf1cbaef8577e585ed00a76b177bcc6b43fc81911545810b515150d19ef42
4efa953ca95ec62bfadd2d7cd2256fd6bfcbb68a69285c72544fd7552e0f31d3 backingFsBlockDev
74dc72c8d1bf67ccf538a22f8c8335e613ceb0577503ca7d782d01d02c3e19bb c36f22e78c1f034dfcd56c2337b757339cbaac6140a94bc52d200cb488ce72f7
78595c9d43b72c4cd4557b05a740c5e606426d6fab57ee7771b6a7b234bfbaa8 ca1d034018d58579dc3934205d6a3983bfa8e201b2215f9fb20f47666f43dcb1
99e6a40b71ce1e97f733d42cd0c52847c98c6a1c44d0fdfa6d951e9dec7f7055 metadata.db
[root@ali_server volumes]# pwd
/var/lib/docker/volumes
数据共享:
使用卷实现数据共享:
创建卷:
[root@ali_server web]# docker volume create nginx-web
nginx-web
[root@ali_server web]# docker volume ls
DRIVER VOLUME NAME
local 4efa953ca95ec62bfadd2d7cd2256fd6bfcbb68a69285c72544fd7552e0f31d3
local 74dc72c8d1bf67ccf538a22f8c8335e613ceb0577503ca7d782d01d02c3e19bb
local 99e6a40b71ce1e97f733d42cd0c52847c98c6a1c44d0fdfa6d951e9dec7f7055
local 08431bc5c0c0242445ba27b8d2fc00b2cf49bde51449edecbd12f5e19d13e4b4
local 78595c9d43b72c4cd4557b05a740c5e606426d6fab57ee7771b6a7b234bfbaa8
local a9dbf1cbaef8577e585ed00a76b177bcc6b43fc81911545810b515150d19ef42
local c36f22e78c1f034dfcd56c2337b757339cbaac6140a94bc52d200cb488ce72f7
local ca1d034018d58579dc3934205d6a3983bfa8e201b2215f9fb20f47666f43dcb1
local nginx-web
[root@ali_server web]# cd /var/lib/docker/volumes/
[root@ali_server volumes]# ls
08431bc5c0c0242445ba27b8d2fc00b2cf49bde51449edecbd12f5e19d13e4b4 backingFsBlockDev
4efa953ca95ec62bfadd2d7cd2256fd6bfcbb68a69285c72544fd7552e0f31d3 c36f22e78c1f034dfcd56c2337b757339cbaac6140a94bc52d200cb488ce72f7
74dc72c8d1bf67ccf538a22f8c8335e613ceb0577503ca7d782d01d02c3e19bb ca1d034018d58579dc3934205d6a3983bfa8e201b2215f9fb20f47666f43dcb1
78595c9d43b72c4cd4557b05a740c5e606426d6fab57ee7771b6a7b234bfbaa8 metadata.db
99e6a40b71ce1e97f733d42cd0c52847c98c6a1c44d0fdfa6d951e9dec7f7055 nginx-web
a9dbf1cbaef8577e585ed00a76b177bcc6b43fc81911545810b515150d19ef42
[root@ali_server volumes]# cd nginx-web/
[root@ali_server nginx-web]# ls
_data
[root@ali_server nginx-web]# cat da
cat: da: No such file or directory
[root@ali_server nginx-web]# cat _data/
cat: _data/: Is a directory
[root@ali_server nginx-web]# cd _data/
[root@ali_server _data]# ls
[root@ali_server _data]#
[root@ali_server _data]# docker volume inspect nginx-web
[
{
"CreatedAt": "2023-06-18T20:10:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-web/_data",
"Name": "nginx-web",
"Options": null,
"Scope": "local"
}
]
[root@ali_server _data]# cp /web/index.html .
[root@ali_server _data]# ls
index.html
[root@ali_server _data]# cat index.html
welcom to north clould server!!!
使用卷:
[root@ali_server _data]# docker run -d -p 8801:80 --name nginx-web-1 -v nginx-web:/usr/share/nginx/html nginx
cefaeaa74b0f45e974bb7265bafc346ebcfd9db54c6ec77d632f21e62362ac0b
[root@ali_server _data]# docker run -d -p 8802:80 --name nginx-web-2 -v nginx-web:/usr/share/nginx/html nginx
316405bce63b9cc1e24826e4239b6202104d1adb71b4b2fe3480480357525888
[root@ali_server _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
316405bce63b nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:8802->80/tcp, :::8802->80/tcp nginx-web-2
cefaeaa74b0f nginx "/docker-entrypoint.…" 32 seconds ago Up 32 seconds 0.0.0.0:8801->80/tcp, :::8801->80/tcp nginx-web-1
aa03810ef7be mysql:5.7.42 "docker-entrypoint.s…" 5 days ago Up 5 days 33060/tcp, 0.0.0.0:33060->3306/tcp, :::33060->3306/tcp sc-mysql-1
[root@ali_server _data]#
7、docker的四种网络类型
1、host模式
容器与宿主机共享network namespace
容器将使用宿主机的IP地址与端口,但是容器的其他方面,如文件系统等仍旧是与宿主机隔离
优点是网络性能好,无需nat转换
缺点是网络的隔离性不好,用过的端口就不能再用了
2、bridge模式
bridge模式会为每一个容器分配、设置一个IP地址等,并将容器通过veth对连接到一个Docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主机通信
bridge模式是Docker的默认模式,一般Docker都会使用172.17.0.0/16这个网段
3、container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
4、none模式
none模式关闭了容器的网络功能,
容器会有自己的network namespace,但是容器不会有其他的网络配置,如网卡,IP,路由等信息,需要手动添加
优点是网络封闭性好,容器安全性高
以上都是宿主机与容器之间的通信
5、overlay网络
Docker的overlay网络是一种用于连接不同宿主机上的Docker容器,同时支持对消息进行加密的网络模型,它有独立的虚拟网段,意味着Docker容器发送的内容会先发送到虚拟子网,再由虚拟子网包装为宿主机的真实网址进行发送
当我们初始化一个swarm或是加入到一个swarm中时,在Docker主机上会出现两种网络:1、称为ingress的overlay网络,用于传递集群服务的控制或是跨主机通信;2、称为docker_gwbridge的bridge网络,用于连接不同节点上的overlay网络
8、docker中常见的文件类型
/var/lib/docker
[root@docker_server docker]# ls
buildkit containers engine-id image network overlay2 plugins runtimes swarm tmp volumes
[root@docker_server 2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd]# pwd
/var/lib/docker/containers/2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd
[root@docker_server 2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd]# pwd
/var/lib/docker/containers/2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd
[root@docker_server 2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd]# cat hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 2a91970ee342
[root@docker_server 2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd]# cat hostname
2a91970ee342
[root@docker_server 2a91970ee342200f7e47d0b87357ea38b4306c31c7269f86d703bf5ece65a8dd]# cat resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114
hosts:存放域名解析
hostname:存放主机名
resolv.conf:容器的dns服务
config.v2.json:json格式的数据(容器的相关配置)