不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

Docker的使用

熟悉Docker的使用

查看版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ docker version
Client:
Cloud integration: v1.0.35
Version: 24.0.2
API version: 1.43
Go version: go1.20.4
Git commit: cb74dfc
Built: Thu May 25 21:51:16 2023
OS/Arch: darwin/arm64
Context: desktop-linux

Server: Docker Desktop 4.21.1 (114176)
Engine:
Version: 24.0.2
API version: 1.43 (minimum version 1.12)
Go version: go1.20.4
Git commit: 659604f
Built: Thu May 25 21:50:59 2023
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
  • docker engine版本号 24.0.2
  • 系统是linux
  • 硬件架构是arm64

查看信息

1
$ docker info

显示的是当前系统相关的信息,例如 CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等。

镜像和容器

拉取镜像

1
2
3
4
5
6
$ docker pull alpineUsing default tag: latest
latest: Pulling from library/alpine
9fda8d8052c6: Pull complete
Digest: sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4a54ba44a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

运行并进入容器

1
2
3
4
5
6
7
8
$ docker run -it alpine sh
/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.18.3
PRETTY_NAME="Alpine Linux v3.18"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"

这样就暂时离开当前的操作系统,进入了容器内部的 Alpine 系统,可以在里面执行任意的命令,比如 cat /etc/os-release。
这个容器环境与外面是完全隔离的,进程、文件系统都独立,不过也有没有隔离的部分,比如时间和内核。
使用 exit 退出容器

再运行一个容器

1
$ docker run -d --rm nginx:alpine

在宿主机里用 ps -ef|grep nginx 可以看到有 3 个 Nginx 进程,它们其实就是容器里的 Nginx 进程,用 docker stop 停止后再用 ps,就能发现它们已经消失了。

说明容器其实就是操作系统里的进程,只是被容器运行环境加上了 namespace、cgroup、chroot 的限制,所以容器和普通进程在资源的使用方面是没有什么区别的,也因为没有虚拟机的成本,启动更迅速,资源利用率也就更高。

构建自己的镜像

构建镜像,需要编写Dockerfile

编写 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 定义变量
ARG IMAGE_BASE="nginx"
ARG IMAGE_TAG="1.21-alpine"
# 指定构建的基础镜像
FROM ${IMAGE_BASE}:${IMAGE_TAG}

ENV PATH=$PATH:/tmp
ENV DEBUG=OFF
# 把构建上下文里的./default.conf 拷贝到镜像的 /etc/nginx/conf.d/
COPY ./default.conf /etc/nginx/conf.d/
# 构建镜像时要执行的 shell 命令,可以是安装软件、创建目录、编译程序等
RUN cd /usr/share/nginx/html \
&& echo "hello nginx" > a.txt
# 声明容器对外服务的端口号
EXPOSE 8081 8082 8083
# 容器的工作目录
WORKDIR /etc/nginx

构建镜像

1
$ docker build -t ngx-app:1.0 .

镜像文件导出

1
$ docker save ngx-app:1.0 -o ngx.tar

镜像文件加载

1
$ docker load -i ngx.tar

与外部系统互通的操作

文件拷贝

1
2
3
4
# 拷贝本地文件到容器里
$ docker cp a.txt 容器ID:/tmp
# 拷贝容器里的文件到本地
$ docker cp 容器ID:/tmp/a.txt ./b.txt

本地目录映射

1
2
# 挂载本地目录,把文件直接映射到容器内部
$ docker run -d --rm -v /tmp:/tmp redis

端口号映射

1
2
# 启动一个 Nginx 容器,把本机的 80 端口映射到容器的 80 端口 
docker run -d -p 80:80 --rm nginx:alpine

使用Docker搭建WordPress

拉取镜像

1
2
3
$ docker pull wordpress:5
$ docker pull mariadb:10
$ docker pull nginx:alpine

启动 MariaDB

设置数据库名、用户名、密码等环境变量

1
2
3
4
5
6
$ docker run -d --rm \
--env MARIADB_DATABASE=db \
--env MARIADB_USER=wp \
--env MARIADB_PASSWORD=123 \
--env MARIADB_ROOT_PASSWORD=123 \
mariadb:10

启动 WordPress

使用刚才的 MariaDB 的用户名、密码

1
2
3
4
5
6
$ docker run -d --rm \
--env WORDPRESS_DB_HOST=172.17.0.2 \
--env WORDPRESS_DB_USER=wp \
--env WORDPRESS_DB_PASSWORD=123 \
--env WORDPRESS_DB_NAME=db \
wordpress:5

启动 Nginx

在配置文件里指定 WordPress 的地址,然后用 -v 参数挂载进容器里

1
2
3
4
$ docker run -d --rm \
-p 80:80 \
-v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf \
nginx:alpine

查看容器状态

打开浏览器,输入本机的127.0.0.1或者服务器的IP地址,就可以看到 WordPress 的界面。

------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!