目录
一.Docker简介及部署方法
1.1. Docker简介
1.2. Docker 虽然有很多优势,但也存在一些缺点:
2.2. 部署第一个容器
二.Docker的基本操作
2.1. Docker镜像管理
2.2. 容器的常用操作
Docker 是一个开源的容器化平台,它可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,从而实现快速部署、高效运行和轻松管理。 以下是 Docker 的一些主要特点和优势:
轻量级和高效性:Docker 容器非常轻量级,相比于传统的虚拟机,它们启动速度更快,占用的系统资源更少。这使得开发者可以在同一台物理机上运行更多的应用实例,提高资源利用率。
可移植性:Docker 容器可以在不同的操作系统和环境中运行,只要该环境安装了 Docker 引擎。这使得应用程序的部署变得更加容易和可靠,无需担心底层环境的差异。
快速部署:使用 Docker,可以快速创建和部署应用程序。开发者可以将应用程序打包成一个容器镜像,然后在任何支持 Docker 的环境中快速部署这个镜像,大大缩短了部署时间。
环境一致性:Docker 容器确保了应用程序在不同环境中的一致性。开发者可以在开发环境中创建一个容器,然后在测试、预生产和生产环境中使用相同的容器镜像,避免了因环境差异导致的问题。
隔离性:Docker 容器提供了良好的隔离性,每个容器都有自己独立的文件系统、网络和进程空间。这使得不同的应用程序可以在同一台物理机上安全地运行,互不干扰。
易于管理:Docker 提供了一系列工具和命令,使得容器的管理变得非常简单。开发者可以轻松地启动、停止、删除容器,以及管理容器的网络和存储。
1.复杂性增加
学习曲线较陡:对于新手来说,理解 Docker 的概念、命令和工作流程可能需要一定的时间和精力。涉及到容器的构建、网络配置、存储管理等多个方面的知识,掌握起来有一定难度。
系统架构复杂性提升:在大规模使用 Docker 的环境中,管理众多容器、容器编排工具以及与其他系统的集成可能会使整体系统架构变得更加复杂,增加了运维和管理的难度。
2.资源占用
虽然相对虚拟机来说 Docker 容器较为轻量,但在运行大量容器时,仍然会占用一定的系统资源,如内存、CPU 和磁盘空间。如果资源分配不合理,可能会导致系统性能下降。
镜像存储也需要占用磁盘空间,随着镜像数量的增加,存储需求可能会成为一个问题。
3.安全性挑战
容器逃逸风险:虽然 Docker 采取了一些安全措施,但仍然存在容器逃逸的风险,即恶意攻击者可能从容器内部突破到宿主机或其他容器,从而对整个系统造成安全威胁。
镜像安全:从不可信的来源获取的镜像可能存在恶意软件或漏洞,一旦部署这些镜像,可能会导致安全问题。
4.网络限制
默认网络配置可能不满足复杂的生产环境需求:Docker 的默认网络模式在某些情况下可能会导致网络性能问题或限制应用程序的网络通信。例如,在跨主机通信或需要特定网络拓扑结构的场景中,可能需要进行复杂的网络配置。
网络隔离不完全:虽然容器之间有一定的网络隔离,但在某些情况下,可能会存在网络泄露的风险,影响应用程序的安全性。
5.存储管理问题
默认存储驱动可能存在性能瓶颈:Docker 的默认存储驱动在某些情况下可能会导致存储性能问题,特别是在处理大量写入操作或大规模数据集时。
数据持久化复杂性:在容器中管理数据持久化需要考虑容器的生命周期和数据的备份、恢复等问题,相对传统的存储管理方式更加复杂。
官方站点:https://docs.docker.com/
#rhel7.9版本配置
#配置软件仓库
# cd /etc/yum.repos.d
# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-
ce/linux/centos/7/x86_64/stable/
#或者阿里云的镜像站也可以https://mirrors.aliyun.com/centos/7.9.2009/extras/x86_64/
gpgcheck=0
[centos]
name=extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/stable/
gpgcheck=0
#rhel9版本配置
cd /etc/yum.repos.d
vim docker.repo
[docker]
name=docker
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
#安装docker-ce并启动服务
#安装docker
[root@node9 ~]# dnf makecache
[root@node9 ~]# dnf search docker
[root@node9 ~]# yum install -y docker-ce
#这里我已经提前下好,所以直接拖入即可
[root@node9 ~]# tar zxf docker.tar.gz
[root@node9 ~]# ls
anaconda-ks.cfg docker.tar.gz
containerd.io-1.7.20-3.1.el9.x86_64.rpm Documents
Desktop Downloads
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm Music
docker-ce-27.1.2-1.el9.x86_64.rpm Pictures
docker-ce-cli-27.1.2-1.el9.x86_64.rpm Public
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm Templates
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm Videos
[root@node9 ~]# dnf install *.rpm -y
#报错,不能下载,是因为有runc包冲突
[root@node9 ~]# dnf remove runc-1.1.0-2.el9.x86_64
[root@node9 ~]# systemctl enable --now docker
[root@node9 ~]# docker info
[root@node9 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
#激活内核网络选项
#在rhel7中 需要
# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
# sysctl --system
# systemctl restart docker
#搜索镜像
[root@Docker-node1 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 20126 [OK]
nginx/nginx-quic-qns NGINX QUIC interop 1
...
#这个国内可以访问的docker镜像加速器https://docker.m.daocloud.io
#openeuler操作系统的docker镜像可以从这里拉取https://hub.oepkgs.net
[root@node9 ~]# cd /etc/docker/
[root@node9 docker]# ls
[root@node9 docker]# vim daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
[root@node9 ~]# systemctl restart docker
#拉取镜像
#从镜像仓库中拉取镜像
[root@node9 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
ec562eabd705: Pull complete
Digest: sha256:9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@node9 ~]# ls #这里我已经提前下载好了,所以直接拖入的。
anaconda-ks.cfg Downloads
containerd.io-1.7.20-3.1.el9.x86_64.rpm game2048.tar.gz
Desktop mario.tar.gz
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm Music
docker-ce-27.1.2-1.el9.x86_64.rpm nginx-latest.tar.gz
docker-ce-cli-27.1.2-1.el9.x86_64.rpm Pictures
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm Public
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm Templates
docker.tar.gz Videos
Documents
[root@node9 ~]# docker load -i game2048.tar.gz
011b303988d2: Loading layer 5.05MB/5.05MB
36e9226e74f8: Loading layer 51.46MB/51.46MB
192e9fad2abc: Loading layer 3.584kB/3.584kB
6d7504772167: Loading layer 4.608kB/4.608kB
88fca8ae768a: Loading layer 629.8kB/629.8kB
Loaded image: timinglee/game2048:latest
[root@node9 ~]# docker load -i mario.tar.gz
4aeeaca5ce76: Loading layer 197.2MB/197.2MB
708fd576a927: Loading layer 208.9kB/208.9kB
90222f49bc4c: Loading layer 4.608kB/4.608kB
5f70bf18a086: Loading layer 1.024kB/1.024kB
dbe97b1b7330: Loading layer 1.536kB/1.536kB
44e5704d49fb: Loading layer 9.912MB/9.912MB
Loaded image: timinglee/mario:latest
[root@node9 ~]# docker load -i nginx-latest.tar.gz
9853575bc4f9: Loading layer 77.83MB/77.83MB
72db5db515fd: Loading layer 114MB/114MB
8b87c0c66524: Loading layer 3.584kB/3.584kB
ec1a2ca4ac87: Loading layer 4.608kB/4.608kB
55e54df86207: Loading layer 2.56kB/2.56kB
f4f00eaedec7: Loading layer 5.12kB/5.12kB
5f0272c6e96d: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest
#查看本地镜像
[root@node9 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5ef79149e0ec 12 days ago 188MB
busybox latest 65ad0d468eb1 15 months ago 4.26MB
timinglee/game2048 latest 19299002fdbe 7 years ago 55.5MB
timinglee/mario latest 9a35a9e43e8c 8 years ago 198MB
#查看镜像信息
[root@node9 ~]# docker pull nginx:1.26-alpine
1.26-alpine: Pulling from library/nginx
c6a83fedfae6: Pull complete
e84a595b509f: Pull complete
49fbf0520b78: Pull complete
8e479110e8a8: Pull complete
ecc9b66af851: Pull complete
09732b09eef5: Pull complete
2a633cf0ba84: Pull complete
128ae6f0c7f5: Pull complete
Digest: sha256:d4d72ee8e6d028c5ad939454164d3645be2d38afb5c352277926a48e24abf4fa
Status: Downloaded newer image for nginx:1.26-alpine
docker.io/library/nginx:1.26-alpine
[root@node9 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.26-alpine 9703b2608a98 12 days ago 43.3MB
nginx latest 5ef79149e0ec 12 days ago 188MB
busybox latest 65ad0d468eb1 15 months ago 4.26MB
timinglee/game2048 latest 19299002fdbe 7 years ago 55.5MB
timinglee/mario latest 9a35a9e43e8c 8 years ago 198MB
[root@node9 ~]# docker image inspect nginx:1.26-alpine
#导出镜像
#保存镜像
[root@node9 ~]# docker image save -o nginx-1.26-alpine.tar.gz nginx:1.26-
[root@node9 ~]# du -sh nginx-1.26-alpine.tar.gz #看看安装包多大。
43M nginx-1.26-alpine.tar.gz
[root@Docker-node1 ~]# docker image save -o nginx:latest nginx-latest.tar.gz
[root@Docker-node1 ~]# docker image save nginx:latest nginx:1.26-alpine -o
nginx.tag.gz
#导入镜像
[root@node9 ~]# docker load -i nginx-1.26-alpine.tar.gz
#保存所有镜像
[root@Docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -o images.tar.gz
Note
-o:指定导出镜像的位置;可以同时导出多个镜像到一个文件中;指定.tar.gz 可以导出并压缩。
#删除镜像
[root@Docker-node1 ~]# docker rmi nginx:1.26-alpine
[root@Docker-node1 ~]# docker rmi `docker images | awk 'NR>1{print $1":"$2}'`
#导入才导出的镜像
[root@node9 ~]# docker load -i images.tar.gz
#启动容器
[root@node9 ~]# docker run -d --rm --name web1 nginx
[root@node9 ~]# docker stop web1
[root@node9 ~]# docker run -it --name test busybox
[root@3ba22e59734f /]# #进入到容器中,按+退出并停止容器,#按+退出但不停止容器
[root@node9 ~]# docker rm test #删除容器
test
#重新进入容器
[root@node9 ~]# docker run -d --name web1 nginx
[root@docker ~]# docker attach test
[root@3ba22e59734f /]#
#在容器中执行命令
[root@docker ~]# docker exec -it test ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
docker rm -f busybox
Note
-d #后台运行
-i #交互式运行
-t #打开一个终端
--name #指定容器名称
-p #端口映射 -p 80:8080 把容器8080端口映射到本机80端口
--rm #容器停止自动删除容器
--network #指定容器使用的网络
#指定网络
[root@node9 ~]# ifconfig
docker0: flags=4163 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:12ff:fe4e:3dc9 prefixlen 64 scopeid 0x20
docker network is
docker run -it --name test busybox #自动分配
docker run -it --name test --network none busybox #指定网络
#查看容器运行信息
[root@Docker-node1 ~]# docker ps #查看当前运行容器
[root@Docker-node1 ~]# docker ps -a #查看所有容器
[root@Docker-node1 ~]# docker inspect busybox #查看容器运行的详细信息
#停止和运行容器
[root@Docker-node1 ~]# docker stop busybox #停止容器
[root@Docker-node1 ~]# docker kill busybox #杀死容器,可以使用信号
[root@Docker-node1 ~]# docker start busybox #开启停止的容器
###容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
#删除容器
[root@Docker-node1 ~]# docker rm busybox #删除停止的容器
[root@Docker-node1 ~]# docker rm -f busybox #删除运行的容器
[root@Docker-node1 ~]# docker container prune -f #删除所有停止的容器
#快速建一个nginx
docker run -d --rm --name webserver -p 80:80 nginx
docker rm -f webserver
#建一个游戏服务器
docker run -d --rm --name game1 -p 80:80 timinglee/game2048:latest
docker rm -f game1
docker run -d --rm --name game2 -p 80:8080 timinglee/mario:latest
docker rm -f game2
#容器内容提交
默认情况下,容器被删除后,在容器中的所有操作都会被清理,包括要保存的文件
如果想永久保存,那么我们需要把动作提交,提交后会生成新的镜像当我们在运行新镜像后即可看到我们提交的内容
此方法不利于企业审计,所以不推荐使用,在企业中我们多用Dockerfile来构建镜像
[root@Docker-node1 ~]# docker run -it --name test busybox
/ # touch leefile #在容器中建立文件
/ # ls
bin etc leefile lib64 root tmp var
dev home lib proc sys usr
/ #
[root@Docker-node1 ~]# docker rm test #删掉容器后
test
[root@Docker-node1 ~]# docker run -it --name test busybox #删掉容器后开启新的容器文
件不存在
/ # ls
bin dev etc home lib lib64 proc root sys tmp usr var #就像软件开启进程,停止后就会不在
[root@Docker-node1 ~]# docker commit -m "add leefile" test busybox:v1
sha256:c8ff62b7480c951635acb6064acdfeb25282bd0c19cbffee0e51f3902cbfa4bd
[root@Docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
busybox v1 c8ff62b7480c 12 seconds ago
4.26MB
[root@Docker-node1 ~]# docker image history busybox:v1
IMAGE CREATED CREATED BY SIZE
COMMENT
c8ff62b7480c 2 minutes ago sh 17B add
leefile
65ad0d468eb1 15 months ago BusyBox 1.36.1 (glibc), Debian 12 4.26MB #最多可以叠加127层。
#系统中的文件和容器中的文件传输
[root@node9 ~]# docker cp test:/leefile /mnt #把容器中的文件复制到本机
Successfully copied 1.54kB to /mnt
[root@node9 ~]# docker cp /etc/passwd test:/ #把本机文件复制到容器中
[root@node9 ~]# docker attach #重新进入容器,看看对应目录用没用文件
#查询容器内部日志
[root@Docker-node1 ~]# docker logs test