docker 背景
一种开源的容器化平台,用于在不同的环境中构建、部署和运行应用程序。它已经成为现代软件开发和部署的核心工具之一,因为它提供了许多超级有用的功能。具有很多的优势:
-
容器化技术: Docker 使用容器化技术,将应用程序及其依赖项、库和环境封装在一个独立的、可移植的单元中,称为容器。这使得应用程序可以在任何支持 Docker 的环境中以一致的方式运行,无论是开发、测试还是生产环境。
-
环境隔离: Docker 容器提供了强大的环境隔离,确保应用程序在容器内部运行时不会干扰主机系统或其他容器。这有助于解决“在我机器上可运行”的问题,使得应用程序在不同环境中一致运行。
-
轻量级和快速启动: Docker 容器相对于传统虚拟机更轻量级,因为它们共享主机操作系统的内核。这使得容器的启动和停止速度非常快,适用于敏捷开发和持续集成/持续交付 (CI/CD) 流程。
-
版本控制和可重复性: Docker 使用镜像来定义应用程序的环境和配置。这些镜像可以通过代码进行版本控制,确保开发、测试和生产环境之间的一致性。这也使得应用程序的部署和升级变得更加可控和可重复。
-
扩展性: Docker 容器可以根据需要进行水平扩展,以满足不同负载的需求。您可以轻松地在多台主机上部署容器,并使用容器编排工具(如 Kubernetes)来自动化管理容器的部署和扩展。
-
生态系统和社区支持: Docker 生态系统丰富多样,拥有大量的镜像仓库和工具,可以加速开发和部署过程。Docker 社区庞大活跃,提供了丰富的文档、教程和支持。
总之,Docker 提供了一种高效、可靠、可移植的方式来构建、交付和运行应用程序,使开发团队能够更快速地创新,降低了部署成本并提高了开发、测试和生产环境的一致性。
Docker 架构
Docker 包括三个基本概念:
-
镜像(Image): 镜像是 Docker 容器的构建块。它是一个轻量级、独立的、可执行的软件包,其中包含了运行应用程序所需的一切。镜像可以被打包、分发和重复使用,使得应用程序的部署和升级变得更加可控和可重复。Docker 镜像是只读的,任何对镜像的更改都会生成新的镜像。就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器(Container): 容器是 Docker 镜像的一个运行实例。它提供了一个隔离的、可执行的运行环境。容器可以启动、停止、暂停和删除,具有轻量级和快速启动的特性。
-
仓库(Repository): 仓库是用于存储和管理 Docker 镜像的地方。DockerHub 是一个公共的 Docker 仓库,开发者可以在其中分享和获取镜像。
另外还有:
-
主机(Docker Host):是指运行 Docker 引擎(Docker Engine)的物理或虚拟计算机系统。Docker 引擎是负责管理容器的核心组件,它负责创建、运行和管理容器,以及提供与容器交互的接口。
-
客户端(Client):与 Docker 引擎交互的工具或命令行界面。它允许用户通过命令行或 API 向 Docker 引擎发送请求,以创建、管理和操作 Docker 容器和镜像。
Docker 安装
在 Docker 的官方网站提供了所有平台的安装方法:Link。但注意适配的版本。
对于 Ubuntu 系统, Docker 提供了非常高效的安装脚本,它不太适用于生产环境,但是非常适合初次接触的学习者:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
卸载 docker 的安装包与所有文件:
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
Hello World
当以上的安装进程跑完后,就可以测试是否成功安装并运行 Dockers 了
打开终端并输入:
docker run hello-world
docker
:Docker 的二进制执行文件。run
: 运行一个容器。hello-world
:指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 拉取公共镜像。
成功后将会返回相关信息:
Hello from Docker!
This message shows that your installation appears to be working correctly.
Ubuntu 容器演示
当使用run
运行容器时,使用的镜像如果在本地不存在,docker 就会自动从 docker 镜像仓库中拉取,默认是从 DockerHub 公共镜像源下载。
例如,我们想要运行一个 Ubuntu 20.04 的系统:
docker run -t -i ubuntu:20.04 /bin/bash # -t -i 表示在容器中打开一个终端,并交互操作
如果本地不存在,则会自动拉取,如下:
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
edaedc954fb5: Pull complete
Digest: sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba
Status: Downloaded newer image for ubuntu:20.04
之后便可以开始与容器中的终端交互了:
root@58f69b95947c:/#
其中58f69b95947c
是容器的 ID,可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
Docker 镜像
docker images
可以使用 docker images 来列出本地主机上的镜像
docker@ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 6df894023726 9 days ago 72.8MB
hello-world latest 9c7a54a9a43c 3 months ago 13.3kB
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,使用 REPOSITORY:TAG 来定义不同的镜像。
docker pull
如果想预先下载这个镜像,可以使用 docker pull 命令来下载它。
docker@ubuntu:~$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
648e0aadf75a: Pull complete
…………
4cadff8bc2aa: Pull complete
Digest: sha256:67f9a4f10d147a6e04629340e6493c9703300ca23a2f7f3aa56fe615d75d31ca
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
可以发现,如果我们不指定版本,会自动拉取最新的版本。
docker search
如果我们不确定是否存在某个镜像或者,拉取过程出现报错,则可以检查一下。
docker@ubuntu:~$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4498 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 5
dockette/apache Apache / HTTPD 1 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 45
manageiq/httpd Container with httpd, built on CentOS for Ma… 1 [OK]
centos/httpd-24-centos8 1
manasip/httpd 0
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
docker rmi
镜像删除使用 docker rmi 命令,比如我们删除 nginx 镜像:
docker@ubuntu:~$ docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:67f9a4f10d147a6e04629340e6493c9703300ca23a2f7f3aa56fe615d75d31ca
Deleted: sha256:89da1fb6dcb964dd35c3f41b7b93ffc35eaf20bc61f2e1335fea710a18424287
…………
Deleted: sha256:c6e34807c2d51444c41c15f4fda65847faa2f43c9b4b976a2f6f476eca7429ce
创建镜像
从 docker 镜像仓库中下载的镜像不能满足需求,可以通过两种方式对镜像进行更改:
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建镜像
docker commit 更新镜像
例如我们在 Ubuntu 环境下进行了操作,然后想打包发给别人用
1、首先创建一个全新的 Ubuntu环境:
docker@ubuntu:~/Desktop$ docker run -it ubuntu:20.04 /bin/bash
root@3bcb7ecde6e7:/#
2、在完成所有的操作后,使用 docker commit
命令来打包容器为镜像。
docker@ubuntu:~/Desktop$ docker commit 3bcb7ecde6e7 zy/ubuntu:V2
sha256:0daeb125eaf0b314995fc96aa2aa507f613da44a01d157488360bc973f10cb54
-m: 提交的描述信息
-a: 指定镜像作者
3bcb7ecde6e7:容器 ID
zy/ubuntu:V2: 指定要创建的目标镜像名
3、再次查看 docker images 就可以发现自己更新后的镜像了
docker@ubuntu:~/Desktop$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zy/ubuntu V2 0daeb125eaf0 9 seconds ago 72.8MB
ubuntu 20.04 6df894023726 11 days ago 72.8MB
hello-world latest 9c7a54a9a43c 3 months ago 13.3kB
Dockerfile 与 docker build 创建镜像
Dockerfile 是一个文本文件,用于定义如何构建一个 Docker 镜像。通过 Dockerfile,可以描述应该在镜像中包含哪些文件、依赖项、环境变量和配置。使用 Dockerfile,可以自动化地创建和配置 Docker 镜像,以便在容器中运行应用程序。
例如,我们想要创建一个基本的 Nginx Web 服务器镜像:
# 使用官方 Nginx 镜像作为基础镜像
FROM nginx:latest
# 将本地的 "index.html" 文件复制到容器中的 "/usr/share/nginx/html" 目录
COPY index.html /usr/share/nginx/html/
# 暴露容器的 80 端口,允许外部访问 Web 服务器
EXPOSE 80
# 设置容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
- FROM nginx:latest:指定基础镜像的指令。使用了官方的 Nginx 镜像作为基础,构建镜像。
- COPY index.html /usr/share/nginx/html/:这个指令复制当前目录下的 index.html 文件到镜像中的 /usr/share/nginx/html/ 目录。
- EXPOSE 80:声明容器将会监听的端口。在这个例子中,我们暴露了容器的 80 端口。
- CMD [“nginx”, “-g”, “daemon off;”]:这个指令设置容器启动时要执行的命令。在这个例子中,我们启动 Nginx 服务并设置其在前台运行。
在同一目录下创建一个名为 index.html
的文件,例如 vim index.html
,并简单的填写:
Hello World!!
填写好 Dockerfile
文件后。并开始使用 docker build
构建镜像,其中.
表示当前目录,my-nginx
是给镜像取的名字。:
docker build -t my-nginx .
完成构建过程后,运行一个容器,这里是将8080端口与容器的80端口连接:
docker run -p 8080:80 my-nginx
这将在端口 8080 上启动一个容器,通过浏览器访问 http://localhost:8080 就可以看到您复制到镜像中的 index.html 页面了。
Docker 容器基础
docker run
Docker 命令的一个核心部分,用于在容器中运行一个新的进程。以下是一些常用用法和选项:
- -it 可以在交互模式下运行容器,可以与容器的命令交互。例如,运行一个 Ubuntu 容器:
docker run -it ubuntu
- –name 为容器指定一个自定义的名称,方便管理:
docker run --name my-container ubuntu
- -p 将容器的端口映射到主机上,方便从外部访问容器中运行的服务:
docker run -p 8080:80 nginx
- -d 将容器置于后台运行:
docker run -d nginx
- -e 设置容器中的环境变量。例如:
docker run -e MYSQL_ROOT_PASSWORD=pass123 mysql
- -w 指定容器内的工作目录。例如:
docker run -w /app my-app-image
- -v 可以挂载主机上的目录或文件到容器内。例如:
docker run -v /host/path:/container/path my-image
- –cpu & --memory 限制容器的 CPU 和内存使用。例如:
docker run --cpu 1 --memory 512m my-image
docker ps
用于列出的容器列表:
通常较为常用的是 docker ps
列出当前的正在运行的容器列表,其中包括了容器的各种信息:
docker@ubuntu:~/Desktop$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2665dd483af my-nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp focused_dewdney
还可以 docker ps -a
列出所有的容器:
docker@ubuntu:~/Desktop$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2665dd483af my-nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp focused_dewdney
7c09e84d69a6 my-nginx "/docker-entrypoint.…" 21 minutes ago Exited (0) 16 minutes ago serene_brahmagupta
7d24d58d8b15 ubuntu:20.04 "/bin/bash" 6 hours ago Exited (0) 20 minutes ago boring_jones
3bcb7ecde6e7 ubuntu:20.04 "/bin/bash" 6 hours ago Exited (0) 6 hours ago sad_franklin
f8261073fdf9 ubuntu:20.04 "/bin/bash" 6 hours ago Exited (100) 6 hours ago blissful_noyce
docker start\stop\restart\rm
当创建一个容器后,就会一直存在,我们可以对其进行开启、停止、重启、删除的操作。
- 使用
docker start <容器 ID>
启动一个已停止的容器:
docker start f2665dd483af
- 使用
docker stop <容器 ID>
停止容器:
docker stop f2665dd483af
- 使用
docker restart <容器 ID>
重启容器:
docker restart f2665dd483af
- 使用
docker rm -f <容器 ID>
强制删除容器:
docker rm -f f2665dd483af
docker attach/exec
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,docker attach
指令进入:
docker attach f2665dd483af
当结束操作退出时,使用 exit
指令,会导致容器的停止。
docker exec
指令则不会出现该问题:
docker exec -it f2665dd483af /bin/bash
docker export/import
如果我们想对某个容器进行快照保存,或者转移到其他设备运行,则我们可以通过 docker export
来导出容器:
docker export 7d24d58d8b15 > ubuntu.tar
可以使用 docker import
从容器快照文件中再导入为镜像,注意,这是镜像:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
docker logs
当容器在后台运行时,可以通过 docker logs -f
来查看实时运行日志
docker@ubuntu:~/Desktop$ docker logs -f 098900ec0f5a
192.168.222.130 - - [12/Aug/2023:18:31:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/116.0" "-"
Docker Compose
一个用于定义和运行多容器 Docker 应用程序的工具。它允许您通过一个单一的YAML 文件(称为 docker-compose.yml)来定义多个容器、它们的配置、关系和服务之间的连接,从而实现容器化应用程序的自动化部署和管理。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义镜像的环境。
- 使用 docker-compose.yml 定义构成镜像的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
Compose 安装
下载 Docker Compose 的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose version
Docker Compose version v2.20.3
YAML 文件
以安装 Nextcloud 的为例子,用于启动一个 Nextcloud 应用和一个 MySQL 数据库服务。它的具体文件如下:
version: '2' # 文件的版本,这里使用的是版本 2。版本号可以根据需要进行调整。
# 该 Compose 文件定义了两个服务:db 和 app。
services:
db: # 名为 db 的服务,它使用 MySQL 镜像创建一个数据库容器
image: mysql # 指定容器运行的镜像
restart: always # 设置容器总是在退出后重新启动
volumes:
- ./cloud/db:/var/lib/mysql # 将主机上的 ./cloud/db 目录映射到容器的 /var/lib/mysql 目录,以保留 MySQL 数据库文件。
environment: # 设置 MySQL 容器的环境变量,包括 root 用户密码、数据库名、用户名等。
- MYSQL_ROOT_PASSWORD=********
- MYSQL_PASSWORD=******
- MYSQL_DATABASE=********
- MYSQL_USER=********
app: # 名为 app 的服务,用于启动 Nextcloud 应用。
image: nextcloud
ports:
- 8888:80 # 将Docker的80端口,映射成主机的8888端口
links: # 将该服务连接到 db 服务,以便应用可以访问数据库服务。
- db
volumes: # 目录分别映射到容器内的相应路径,以保留 Nextcloud 配置、数据和应用文件。
- ./cloud/config:/var/www/html/config
- /home/zy/data/nextcloud:/var/www/html/data # 这里是映射到外置硬盘,也自行修改
- ./cloud/apps:/var/www/html/apps
restart: always
docker 小工具
Portainer
一个开源的 Docker 管理界面,它提供了图形化的界面来管理 Docker 容器、镜像、卷、网络等。以下是在 Docker 中安装 Portainer 的一般步骤:
创建一个 Portainer 数据卷,用于持久性存储 Portainer 的配置和数据。
docker volume create portainer_data
使用以下命令来拉取运行 Portainer 容器。您可以根据需要调整端口号和数据卷的名称。
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
评论区