侧边栏壁纸
  • 累计撰写 131 篇文章
  • 累计创建 16 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Docker 入门与实践

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@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
0

评论区