diff --git a/06_repository/6.4_nexus3_registry.md b/06_repository/6.4_nexus3_registry.md index 1074923..8e574d7 100644 --- a/06_repository/6.4_nexus3_registry.md +++ b/06_repository/6.4_nexus3_registry.md @@ -119,8 +119,11 @@ server { 使用 SSL 加密以后程序需要访问就不能采用修改配置的方式了。具体方法如下: ```bash -$ openssl s_client -showcerts -connect YourDomainName OR HostIP:443 /dev/null|openssl x509 -outform PEM >ca.crt +## REGISTRY_HOST 填你的域名或主机 IP,二者选其一 + +$ REGISTRY_HOST=your-domain-or-host-ip +$ openssl s_client -showcerts -connect "$REGISTRY_HOST":443 /dev/null|openssl x509 -outform PEM >ca.crt $ cat ca.crt | sudo tee -a /etc/ssl/certs/ca-certificates.crt -$ systemctl restart docker +$ sudo systemctl restart docker ``` -使用 `docker login YourDomainName OR HostIP` 进行测试,用户名密码填写上面 Nexus 中设置的。 +使用 `docker login $REGISTRY_HOST` 进行测试,用户名密码填写上面 Nexus 中设置的。 diff --git a/08_data/8.2_bind-mounts.md b/08_data/8.2_bind-mounts.md index 65bd08a..4c1fa22 100644 --- a/08_data/8.2_bind-mounts.md +++ b/08_data/8.2_bind-mounts.md @@ -261,7 +261,7 @@ $ docker run -v /host/path:/container/path:cached myapp ```bash ## 代码热更新 -$ docker run -v $(pwd):/app -p 3000:3000 node npm run dev +$ docker run -v "$(pwd)":/app -w /app -p 3000:3000 node:22 npm run dev ``` #### 2. 生产环境使用 Volume diff --git a/11_compose/11.4_commands.md b/11_compose/11.4_commands.md index ee0ca35..740fece 100644 --- a/11_compose/11.4_commands.md +++ b/11_compose/11.4_commands.md @@ -58,7 +58,7 @@ docker compose [-f=...] [options] [COMMAND] [ARGS...] 构建 (重新构建) 项目中的服务容器。 -服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。 +服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 服务,构建出的镜像是 `web-db`。(Compose V1 用下划线拼接为 `web_db`,V2 起统一改为连字符,只有加 `--compatibility` 才会回到下划线。) 可以随时在项目目录下运行 `docker compose build` 来重新构建服务。 diff --git a/12_implementation/12.6_network.md b/12_implementation/12.6_network.md index da5907d..4e51b59 100644 --- a/12_implementation/12.6_network.md +++ b/12_implementation/12.6_network.md @@ -56,7 +56,7 @@ inet 172.17.0.1/16 scope global docker0 创建一对 “veth pair” 接口 A 和 B,绑定 A 到网桥 `docker0`,并启用它 ```bash $ sudo ip link add A type veth peer name B -$ sudo brctl addif docker0 A +$ sudo ip link set A master docker0 $ sudo ip link set A up ``` 将 B 放到容器的网络命名空间,命名为 eth0,启动它并配置一个可用 IP (桥接网段) 和默认网关。 diff --git a/14_kubernetes_setup/14.1_kubeadm.md b/14_kubernetes_setup/14.1_kubeadm.md index 4128137..b24abcf 100644 --- a/14_kubernetes_setup/14.1_kubeadm.md +++ b/14_kubernetes_setup/14.1_kubeadm.md @@ -131,7 +131,7 @@ EOF # 应用配置 -$ sysctl --system +$ sudo sysctl --system ``` ### 14.1.5 配置 kubelet @@ -213,9 +213,9 @@ kubeadm join :6443 --token \ 在 **另一主机** 重复 **部署** 小节以前的步骤,安装配置好 kubelet。根据提示,加入到集群。 ```bash -$ systemctl enable containerd +$ sudo systemctl enable containerd -$ systemctl start containerd +$ sudo systemctl start containerd $ kubeadm join :6443 \ --token \ diff --git a/14_kubernetes_setup/14.2_kubeadm-docker.md b/14_kubernetes_setup/14.2_kubeadm-docker.md index b0d535f..81a7e58 100644 --- a/14_kubernetes_setup/14.2_kubeadm-docker.md +++ b/14_kubernetes_setup/14.2_kubeadm-docker.md @@ -162,7 +162,7 @@ EOF # 应用配置 -$ sysctl --system +$ sudo sysctl --system ``` ### 14.2.5 配置 kubelet diff --git a/15_etcd/demo/cluster/docker-compose.yml b/15_etcd/demo/cluster/docker-compose.yml index 097baac..97ecf9a 100644 --- a/15_etcd/demo/cluster/docker-compose.yml +++ b/15_etcd/demo/cluster/docker-compose.yml @@ -1,4 +1,3 @@ -version: "3.6" services: node1: diff --git a/appendix/best_practices.md b/appendix/best_practices.md index 6beffdf..32b854c 100644 --- a/appendix/best_practices.md +++ b/appendix/best_practices.md @@ -167,9 +167,11 @@ RUN apt-get update && apt-get install -y \ #### CMD -`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ['executable', 'param1', 'param2'...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务 (比如 `Apache`),你可能会执行类似于 `CMD ['apache2', '-DFOREGROUND']` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。 +`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务 (比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。 -多数情况下,`CMD` 都需要一个交互式的 `shell` (bash,Python,perl 等),例如 `CMD ['perl', '-de0']`,或者 `CMD ['PHP', '-a']`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ['param', 'param']` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。 +> 注意:exec 形式是 JSON 数组,**必须用双引号**。写成 `CMD ['apache2', '-DFOREGROUND']` 并不会报错,但 Docker 解析不出 JSON,会退回 shell 形式执行整串字符,导致启动失败。参见 [7.4 CMD](../07_dockerfile/7.4_cmd.md)。 + +多数情况下,`CMD` 都需要一个交互式的 `shell` (bash,Python,perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["php", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。 #### EXPOSE @@ -179,20 +181,20 @@ RUN apt-get update && apt-get install -y \ #### ENV -为了方便新程序运行,你可以使用 `ENV` 来为容器中安装的程序更新 `PATH` 环境变量。例如使用 `ENV PATH /usr/local/nginx/bin:$PATH` 来确保 `CMD ["nginx"]` 能正确运行。 +为了方便新程序运行,你可以使用 `ENV` 来为容器中安装的程序更新 `PATH` 环境变量。例如使用 `ENV PATH=/usr/local/nginx/bin:$PATH` 来确保 `CMD ["nginx"]` 能正确运行。 `ENV` 指令也可用于为你想要容器化的服务提供必要的环境变量,比如 Postgres 需要的 `PGDATA`。 最后,`ENV` 也能用于设置常见的版本号,比如下面的示例: ```docker -ENV PG_MAJOR 9.3 +ENV PG_MAJOR=9.3 -ENV PG_VERSION 9.3.4 +ENV PG_VERSION=9.3.4 RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgres && … -ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH +ENV PATH=/usr/local/postgres-$PG_MAJOR/bin:$PATH ``` 类似于程序中的常量,这种方法可以让你只需改变 `ENV` 指令来自动的改变容器中的软件版本。 diff --git a/appendix/repo/nodejs.md b/appendix/repo/nodejs.md index a5b61a9..0625465 100644 --- a/appendix/repo/nodejs.md +++ b/appendix/repo/nodejs.md @@ -20,7 +20,7 @@ EXPOSE 8888 然后创建镜像,并启动容器。 ```bash -$ docker build -t my-nodejs-app +$ docker build -t my-nodejs-app . $ docker run -it --rm --name my-running-app my-nodejs-app ``` 也可以直接运行一个简单容器。 @@ -28,8 +28,6 @@ $ docker run -it --rm --name my-running-app my-nodejs-app ```bash $ docker run -it --rm \ --name my-running-script \ - # -v "$ ":/usr/src/myapp \ - --mount type=bind,src="$(pwd)",target=/usr/src/myapp \ -w /usr/src/myapp \ node:22-alpine \