Docker入门指南:从零开始掌握容器化技术
·
目录
前言
在当今的软件开发领域,“容器化”已经成为一个绕不开的热词。而作为容器化技术的代名词,Docker凭借其轻量、高效、可移植的特性,彻底改变了应用的开发、交付和运行方式。无论你是开发人员、运维工程师,还是技术爱好者,掌握 Docker 都能让你的工作流程如虎添翼。
一、Docker简介及部署方法
1.1 什么是docker?
Docker
是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术
它具有以下几个重要特点和优势:
1.
轻量级虚拟化
:
Docker
容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。
例如,启动一个
Docker
容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。
2.
一致性
:确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。
无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。
3.
可移植性
:可以轻松地将
Docker
容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差
异。
比如,在本地开发的容器可以无缝部署到云服务器上。
4.
高效的资源利用
:多个
Docker
容器可以共享主机的操作系统内核,从而更有效地利用系统资
源。
5.
易于部署和扩展
:能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。
总之,
Docker
极大地简化了应用程序的开发、部署和管理流程,提高了开发效率和运维的便利性。
它在现代软件开发和云计算领域得到了广泛的应用。
1.2 docker在企业中的应用场景

在企业中
docker
作为业务的最小载体而被广泛应用
通过
docker
企业可以更效率的部署应用并更节省资源
Note
IaaS
(
Infrastructure as a Service
),即基础设施即服务
PaaS
是(
Platform as a Service
)即指平台即服务
SaaS
(
Software as a Service
)软件运营服务
1.3 docker与虚拟化的对比


1.4 docker的优势
对于开发人员:
Build once
、
Run anywhere
。
对于运维人员:
Configure once
、
Run anything
容器技术大大提升了
IT
人员的幸福指数!
二、部署docker
2.1 容器工作方法

2.2 部署第一个容器
官方站点:
https://docs.docker.com/
2.2.1 配置软件仓库
cd /etc/yum.repos.d
vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable
gpgcheck=0
2.2.2 安装docker-ce并启动服务
#安装docker
]# yum install -y docker-ce
#编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--iptables=true
]# systemctl enable --now docker
]# docker info
2.2.3 激活内核网络选项
]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
]# modprobe br_netfilter
]# 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
三、 Docker的基本操作
3.1 Docker镜像管理
3.1.1
搜索镜像
[root@Docker-node1 ~]# docker search nginx
NAME DESCRIPTION STARS
OFFICIAL
nginx Official build of Nginx. 20094 [OK]

3.1.2 docker常用命令
#镜像查看
[root@docker-node1 ~]# docker images IMAGE ID DISK USAGE CONTENT SIZE EXTRA
#搜索镜像
[root@docker-node1 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 21206
#下载镜像
[root@docker-node1 ~]# docker pull nginx
[root@docker-node1 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
61dfb50712f5: Pull complete
96cfb76e59bd: Download complete
Digest: sha256:b3255e7dfbcd10cb367af0d409747d511aeb66dfac98cf30e97e87e4207dd76f
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
#查看镜像提交历史
[root@docker-node1 ~]# docker history busybox:latest
IMAGE CREATED CREATED BY SIZE COMMENT
b3255e7dfbcd 17 months ago BusyBox 1.37.0 (glibc), Debian 13 4.49MB
[root@docker-node1 ~]# docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
busybox:latest b3255e7dfbcd 6.7MB 2.22MB
nginx:1.26 41b194461e4b 279MB 75.2MB
#导出镜像
[root@docker-node1 ~]# docker save -o game2048-latest.tar timinglee/game2048:latest
#删除镜像
[root@docker-node1 ~]# docker rmi timinglee/mario:latest
#导入镜像
[root@docker-node1 ~]# docker load -i game2048-latest.tar
#运行镜像
[root@docker-node1 ~]# docker run -d --name web nginx:1.26
f3e369725fab95d48779eaa556941b735aae841efe09bb1d28bca89923c44ee4
#查看运行容器
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3e369725fab nginx:1.26 "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 80/tcp web
#查看所有容器
[root@docker-node1 ~]# docker ps -a
#交互模式运行容器
[root@docker-node1 ~]# docker run -it --name busybox busybox:latest
#交互运行容器默认退出后会停止
[root@docker-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1b27167a247 busybox:latest "sh" 50 seconds ago Exited (0) 19 seconds ago busybox
#运行停止的容器
[root@docker-node1 ~]# docker start busybox
root@docker-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1b27167a247 busybox:latest "sh" 2 minutes ago Up 1 second busybox
#退出交互容器不对其停止
[root@docker-node1 ~]# docker attach busybox
/ # [ctrl]+[p]+[q] #按键
[root@docker-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1b27167a247 busybox:latest "sh" 3 minutes ago Up About a minute busybox
#查看容器信息
[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 exec busybox touch /root/haha #非交互
[root@docker-node1 ~]# docker exec busybox ls /root
file1
file2
haha
[root@docker-node1 ~]# docker exec -it web /bin/bash #交互的
root@f3e369725fab:/#
#容器删除
[root@docker-node1 ~]# docker rm -f busybox
busybox
[root@docker-node1 ~]# docker stop web
web
[root@docker-node1 ~]# docker rm web
web
#内容提交
[root@docker-node1 ~]# docker run -it --name test busybox:latest
/ # touch /root/file
/ # ls /root/
file
ctrl+qp 退出当前环境并继续运行容器
[root@docker-node1 ~]# docker commit -m "add file" test busybox-file:latest
sha256:31a32089d241d025a5a54f144f15319cc6fb55be1b41d049f8905a472d5a028e
[root@docker-node1 ~]# docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
busybox-file:latest 31a32089d241 6.71MB 2.21MB
[root@docker-node1 ~]# docker run -it --name test busybox-file:latest
#文件在镜像中的复制
[root@docker-node1 ~]# docker run -it --name test busybox-file:latest
root@docker-node1 ~]# docker cp test:/root/file /mnt
Successfully copied 1.54kB to /mnt
[root@docker-node1 ~]# ls /mnt/
file hgfs
[root@docker-node1 ~]# docker cp /etc/passwd test:/root/
Successfully copied 3.07kB to test:/root/
[root@docker-node1 ~]# docker exec test ls /root
file
passwd
四、 docker镜像构建
4.1 docker镜像结构

共享宿主机的
kernel
base
镜像提供的是最小的
Linux
发行版
同一
docker
主机支持运行多种
Linux
发行版
采用分层结构的最大好处是:共享资源
4.2 镜像运行的基本原理

Copy-on-Write
可写容器层
容器层以下所有镜像层都是只读的
docker
从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
一个镜像最多127层
4.3 镜像获得方式
基本镜像通常由软件官方提供
企业镜像可以用官方镜像
+Dockerfile
来生成
系统关于镜像的获取动作有两种:
docker pull
镜像地址
docker load –i
本地镜像包
4.4 镜像构建
4.4.1 构建参数

参数示例及用法
#FROM COPY 和MAINTAINER
[root@Docker-node1 ~]# mkdir docker/
[root@Docker-node1 ~]# cd docker/
[root@Docker-node1 docker]# touch leefile
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox:latest #指定使用的基础镜像
MAINTAINER lee@timinglee.org #指定作者信息
COPY leefile / #复制当前目录文件到容器指定位置,leefile必须在当前目录中
[root@Docker-node1 docker]# docker build -t example:v1 . #构建镜像
#ADD
[root@Docker-node1 docker]# touch leefile{1..3}
[root@Docker-node1 docker]# tar zcf leefile.gz leefile*
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
MAINTAINER lee@timinglee.org
COPY leefile /
ADD leefile.gz /
[root@Docker-node1 docker]# docker build -t example:v2 .
[root@Docker-node1 docker]# docker run -it --rm --name test example:v2
/ # ls
bin etc leefile leefile2 lib proc sys usr
dev home leefile1 leefile3 lib64 root tmp var
#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3
lee
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
#CMD echo $NAME
CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3
$NAME
#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
#CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3
lee
#ENTRYPOINT
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
ENTRYPOINT echo $NAME
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3 sh
lee
#EXPOSE VOLUME VOLUME
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
EXPOSE 80 443
VOLUME /var/www/html
WORKDIR /var/www/html
RUN touch leefile
[root@Docker-node1 docker]# docker build -t example:v4 .
[root@Docker-node1 docker]# docker run -it --rm --name test example:v4
/var/www/html #
4.4.2 Dockerfile实例
4.4.2.1
建立构建目录,编写构建文件
[root@server1 ~]# mdkir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# cp ~/nginx-1.23.3.tar.gz .
[root@server1 docker]# vim Dockerfile
FROM centos:7
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
4.4.2.2
通过
dockerfile
生成镜像
[root@server1 docker]# docker build -t webserver:v1 .
4.4.2.3
测试镜像可用性
[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v1 bfd6774cc216 8 seconds ago 494MB
[root@server1 docker]# docker history webserver:v1
[root@server1 docker]# docker run -d --name checkimage webserver
4.4.2.4
查看容器详情
[root@server1 docker]# docker inspect web1
五、容器编排工具Docker Compose
5.1 Docker Compose 概述
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
其是官方的一个开源项目,托管到github上
主要功能
1.
定义服务
:
使用
YAML
格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、
环境变量、存储卷等参数。
例如,可以在配置文件中定义一个
Web
服务和一个数据库服务,以及它们之间的连接关系。
2.
一键启动和停止
:
通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器
应用的部署和管理过程。
例如,使用
docker-compose up
命令可以启动配置文件中定义的所有服务,使用
docker
compose down
命令可以停止并删除这些服务。
3.
服务编排
:
可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库
服务必须在
Web
服务之前启动。
支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的
容器连接到这个网络上。
4.
环境变量管理
:
可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、
测试和生产环境)中使用不同的配置变得更加容易。
例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。
工作原理
1.
读取配置文件
:
Docker Compose
读取
YAML
配置文件,解析其中定义的服务和参数。
/
#
2.
创建容器
:
根据配置文件中的定义,
Docker Compose
调用
Docker
引擎创建相应的容器。它会下载所需
的镜像(如果本地没有),并设置容器的各种参数。
3.
管理容器生命周期
:
Docker Compose
监控容器的状态,并在需要时启动、停止、重启容器。
它还可以处理容器的故障恢复,例如自动重启失败的容器。
Docker Compose
中的管理层
1.
服务
(service)
一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
2.
项目
(project)
由一组关联的应用容器组成的一个完整业务单元,在
docker-compose.yml
文件中
定义
3.
容器(
container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义的镜像创建的运行实例
5.2 Docker Compose 的常用命令参数
version: "1.0"
services:
web:
image: nginx
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: lee
以下是一些
Docker Compose
常用命令:
一、服务管理
1.
docker-compose up
:
启动配置文件中定义的所有服务。
可以使用
-d
参数在后台启动服务。
可以使用
-f
来指定
yml
文件
例如:
docker-compose up -d
。
[root@docker test]# docker compose up -d
[+] Running 2/2
✔ Container test-db-1 Started 0.9s
✔ Container test-web-1 Started 0.9s
[root@docker ~]# docker compose -f test/docker-compose.yml up -d
[+] Running 3/3
✔ Network test_default Created 0.1s
✔ Container test-web-1 Started 0.9s
✔ Container test-db-1 Started
2.
docker-compose down
:
停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。
[root@docker test]# docker compose down
[+] Running 3/3
✔ Container test-db-1 Removed
1.7s
✔ Container test-web-1 Removed
0.3s
✔ Network test_default Removed
0.1s
3.
docker-compose start
:
启动已经存在的服务,但不会创建新的服务。
[root@docker test]# docker compose start
[+] Running 2/2
✔ Container test-db-1 Started
✔ Container test-web-1 Started
4.
docker-compose stop
:
停止正在运行的服务
[root@docker test]# docker compose stop
[+] Stopping 2/2
✔ Container test-web-1 Stopped
0.4s
✔ Container test-db-1 Stopped
10.3s
5.
docker-compose restart
:
重启服务
[root@docker test]# docker compose restart
[+] Restarting 2/2
✔ Container test-web-1 Started
✔ Container test-db-1 Started
二、服务状态查看
1.
docker-compose ps
:
列出正在运行的服务以及它们的状态,包括容器
ID
、名称、端口映射等信息。
[root@docker test]# docker compose ps
NAME IMAGE COMMAND SERVICE CREATED
STATUS PORTS
test-db-1 mysql:5.7 "docker-entrypoint.s…" db 2 minutes ago
Up 48 seconds 3306/tcp, 33060/tcp
test-web-1 nginx "/docker-entrypoint.…" web 2 minutes ago
Up 50 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp
2.
docker-compose logs
:
查看服务的日志输出。可以指定服务名称来查看特定服务的日志
[root@docker test]# docker compose logs db
5.3 Docker Compose 的yml文件
Docker Compose
的
YAML
文件用于定义和配置多容器应用程序的各个服务。以下是一个基本的
Docker Compose YAML
文件结构及内容解释:
一、服务(
services
)
1.
服务名称(
service1_name/service2_name
等)
:
每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。
services:
web:
# 服务1的配置
mysql:
# 服务2的配置
2.
镜像(
image
)
:
指定服务所使用的
Docker
镜像名称和标签。例如,
image: nginx:latest
表示使用
nginx
镜像的最新版本
services:
web:
images:nginx
mysql:
images:mysql:5.7
3.
端口映射(
ports
)
:
将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如,
-
"8080:80"
表示将主机的
8080
端口映射到容器内部的
80
端口。
services:
web:
image: timinglee/mario
container_name: game #指定容器名称
restart: always #docekr容器自动启动
expose:
- 1234 #指定容器暴露那些端口,些端口仅对链接的服务
可见,不会映射到主机的端口
ports:
- "80:8080"
4.
环境变量(
environment
)
:
为容器设置环境变量,可以在容器内部的应用程序中使用。例如,
VAR1: value1
设置环境变
量
VAR1
的值为
value1
services:
web:
images:mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: lee
5.
存储卷(
volumes
)
:
将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。例如,
-
/host/data:/container/data
将主机上的
/host/data
目录挂载到容器内的
/container/data
路径。
services:
test:
image: busybox
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
volumes:
- /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置
6.
网络(
networks
)
:
将服务连接到特定的网络,以便不同服务的容器可以相互通信
services:
web:
image: nginx
container_name: webserver
network_mode: bridge #使用本机自带bridge网络
services:
test:
image: busybox
container_name: webserver
command: ["/bin/sh","-c","sleep10000000"]
#network_mode: mynet2
networks:
- mynet1
- mynet2
networks:
mynet1:
driver: bridge
mynet2:
driver: bridge
7.
命令(
command
)
:
覆盖容器启动时默认执行的命令。例如,
command: python app.py
指定容器启动时运行
python app.py
命令
[root@docker test]# vim busybox.yml
services:
web:
image: busybox
container_name: busybox
#network_mode: mynet2
command: ["/bin/sh","-c","sleep10000000"]
二、网络(
networks
)
定义
Docker Compose
应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。
默认情况下
docker compose
在执行时会自动建立网路
services:
test:
image: busybox1
command: ["/bin/sh","-c","sleep 3000"]
restart: always
network_mode: default
container_name: busybox
test1:
image: busybox2
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
networks:
- mynet1
test3:
image: busybox3
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
networks:
- mynet1
networks:
mynet1:
driver: bridge #使用桥接驱动,也可以使用macvlan用于跨主机连接
default:
external: true #不建立新的网络而使用外部资源
name: bridge #指定外部资源网络名字
mynet2:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.254
三、存储卷(
volumes
)
定义
Docker Compose
应用程序中使用的存储卷。可以自定义卷名称和存储位置等属性
services:
test:
image: busybox
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
volumes:
- data:/test #挂在data卷
- /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置
volumes:
data:
name: timinglee #指定建立卷的名字
5.4 企业示例
利用容器编排完成
haproxy
和
nginx
负载均衡架构实施
services:
web1:
image: nginx:latest
container_name: web1
restart: always
networks:
- mynet1
expose:
- 80
volumes:
- /docker/web/html1:/usr/share/nginx/html
web2:
image: nginx:latest
container_name: web2
restart: always
networks:
- mynet1
expose:
- 80
volumes:
- /docker/web/html2:/usr/share/nginx/html
haproxy:
image: haproxy:2.3
container_name: haproxy
restart: always
networks:
- mynet1
- mynet2
volumes:
- /docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- 80:80
networks:
mynet1:
driver: bridge
mynet2:
driver: bridge
总结
通过本文,你应该已经对 Docker 有了一个全面的入门认识:
· 理解了容器化技术的价值
· 学会了安装 Docker
· 掌握了核心概念和常用命令
· 能够编写 Dockerfile 构建自定义镜像
· 使用 docker-compose 编排多容器应用
Docker 的世界远不止于此,它还有 Swarm 集群、Kubernetes 编排等更广阔的天地。但千里之行始于足下,希望这篇指南能成为你容器化之旅的坚实起点。
如果你在实践过程中遇到任何问题,欢迎在评论区留言交流!也期待你分享自己用 Docker 部署的有趣项目。(本人大三学生一枚,第一次写这么长的文章,希望对各位有所帮助!)
更多推荐

所有评论(0)