熟悉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
查看信息
显示的是当前系统相关的信息,例如 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
COPY ./default.conf /etc/nginx/conf.d/
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 的界面。