目录

前言

一、Docker简介及部署方法

1.1 什么是docker?

1.2 docker在企业中的应用场景

1.3 docker与虚拟化的对比

1.4 docker的优势

二、部署docker

2.1 容器工作方法

2.2 部署第一个容器

2.2.1 配置软件仓库

2.2.2 安装docker-ce并启动服务

2.2.3 激活内核网络选项

三、 Docker的基本操作

3.1 Docker镜像管理

3.1.2 docker常用命令

四、 docker镜像构建

4.1 docker镜像结构

4.2 镜像运行的基本原理

4.3 镜像获得方式

4.4 镜像构建

4.4.1 构建参数

4.4.2 Dockerfile实例

五、容器编排工具Docker Compose

5.1 Docker Compose 概述

5.2 Docker Compose 的常用命令参数

5.3 Docker Compose 的yml文件

5.4 企业示例

总结


前言

在当今的软件开发领域,“容器化”已经成为一个绕不开的热词。而作为容器化技术的代名词,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 部署的有趣项目。(本人大三学生一枚,第一次写这么长的文章,希望对各位有所帮助!)

更多推荐