docker 常用基本操作命令
[repository]:[tag] 在没有指定tag时,默认是latest,代表最新版本的镜像
mysql(Repository)存储库: 5.7(Tag)标签

docker pull nginx  拉取nginx镜像
docker images 查看拉取到的镜像
docker xx --help 查看xx的命令语法
docker save 导出镜像到磁盘
docker load 加载镜像
docker rmi  删除镜像
docker push  上传镜像

容器命令
docker run --name mn -p 80:80 -d nginx
docker run:创建并运行一个容器
--name:给容器起一个名字,比如叫做mn
-p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。-p 宿主机端口:容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx

docker exec    进入容器执行命令
docker logs    查看容器运行日志
docker ps    查看所有运行的容器及状态
docker pause    暂停容器
docker unpause    运行容器
docker stop    停止容器
docker start    开启容器
docker rm   删除指定容器

docker rm -f  <container_id> 强制停止并删除容器,将 <container_id> 替换为容器的 ID 或名称。如果不确定容器的 ID,可以使用 docker ps 查看所有正在运行的容器。

1. 拉取Nginx镜像

docker pull nginx

docker容器可以做到秒级启动,开箱即用,用完即可删除。但是如果你希望容器内的文件持久化存储,就需要把容器内的目录和配置文件挂载出来。

nginx通常需要持久化的目录以及配置的容器路径(有时可能还得挂载个日志目录):

①nginx容器内部署前端的路径

/usr/share/nginx/html

② nginx容器内配置文件路径。nginx.conf 用于配置反向代理、负载均衡、动静分离.... 

/etc/nginx/nginx.conf

2. 开始正式挂载容器文件目录

2.1  在宿主机(CentOS7.9)上,创建两个目录用来存放上边说的前端文件和nginx配置文件

登录CentOS执行以下命令:

回到根目录

cd / 

进入咱们的/usr/local下

cd /usr/local

创建nginx文件夹后再进入nginx文件夹里创建前端文件夹,nginx配置文件夹

mkdir nginx  //创建nginx文件夹

cd nginx  //进入nginx文件夹

mkdir html  //创建前端文件夹

mkdir conf  //创建nginx配置文件夹

上面是用命令的方式创建目录,另外也可以借助xftp以图形界面的方式创建目录,如下图:

2.2 使用docker 创建一个 nginx 容器

docker run --name mynginx --rm -d nginx 

--rm  表示容器停止后就删除该容器
-d  表示后台运行容器, -d nginx 这里的nginx是表示nginx镜像
--name  给容器起名字,mynginx就是容器的名字

2.3 使用以下命令查看创建的 mynginx 容器是否正在运行中

docker ps

2.4 把nginx容器内的默认配置文件拷贝到刚才创建的nginx宿主机配置文件夹目录/usr/local/nginx/conf 下

docker cp mynginx:/etc/nginx/nginx.conf /usr/local/nginx/conf

2.5 拷贝完成后停止nginx容器

docker stop mynginx

nginx容器停止后,使用docker ps -a 查看容器,你就看不到了
-a 表示查看所有容器, 不加查看正在运行的容器

2.6 现在就开始正式的文件挂载,(注意:以下是一整行命令)

docker run --restart always --name mynginx -d -p 80:80 -v /usr/local/nginx/html:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx

这条 Docker 命令用于运行一个名为 `mynginx` 的 Nginx 容器,并且具备以下含义:

1. **`docker run`**:运行一个新的 Docker 容器。
   
2. **`--restart always`**:设置容器的自动重启策略为 `always`,即使容器意外退出也会自动重启,除非手动停止容器。 

3. **`--name mynginx`**:将容器命名为 `mynginx`,便于后续管理。

4. **`-d`**:以“分离模式”运行容器,即容器会在后台运行,不会占用当前终端。

5. **`-p 80:80`**:将主机的 80 端口映射到容器的 80 端口,这样用户可以通过主机的 80 端口访问容器中的 Nginx 服务。

6. **`-v /usr/local/nginx/html:/usr/share/nginx/html`**:挂载主机的 `/usr/local/nginx/html` 目录到容器的 `/usr/share/nginx/html` 目录。Nginx 默认在这个目录下寻找 HTML 文件,因此这样可以方便地将主机上的 HTML 文件暴露给 Nginx。

7. **`-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf`**:挂载主机的 Nginx 配置文件 `/usr/local/nginx/conf/nginx.conf` 到容器的 `/etc/nginx/nginx.conf`,以使用主机上的自定义 Nginx 配置文件覆盖容器中的默认配置。

8. **`nginx`**:指定使用 Nginx 镜像来创建容器。

**注意**:这条命令中 `-v /usr/local/nginx/html: /usr/share/nginx/html` 中的挂载路径 `:/usr/share/nginx/html` 前不能有多余的空格,需去掉才能正常运行。

--restart always 保证特殊情况重启容器
-p 把容器内的端口映射到宿主机, -p [宿主机端口]:[容器内端口]
这样我们直接在浏览器输入你的服务器ip就可以看到nginx的欢迎页了,阿里云服务器还要在安全组内开放80端口。
-v 就是把容器内的目录映射到宿主机的目录,这样就算容器删除了我们的数据还在 。

以后部署的时候就可以把前端打包后的静态资源放在/usr/local/nginx/html路径下,然后执行docker restart mynginx就可以啦!

From ChatGPT:

注意:要为已经创建的容器挂载新的 Volume,直接修改已经存在的容器是不行的。常见的方案是重新创建一个容器并指定挂载配置。以下是两种实现方式:

### 方法一:删除并重新创建容器

1. **查看当前容器的配置**:可以使用以下命令获取容器的创建配置,以便重新创建容器时保持相同的设置。

docker inspect <container_id>

2. **停止并删除旧容器**:

docker stop <container_id>
docker rm <container_id>

3. **重新创建容器并挂载 Volume**:

   假设要将宿主机的 `/path/to/host/dir` 目录挂载到容器的 `/path/to/container/dir`,可以使用以下命令重新创建容器:

docker run -d --name <container_name>  -v /path/to/host/dir:/path/to/container/dir  <image_name>

   在这里,`-v` 参数用于指定新的 Volume 挂载路径。

### 方法二:使用 `docker commit` 保留当前容器状态并创建新容器

如果需要保留当前容器的所有更改,使用 `docker commit` 创建一个新的镜像,然后基于这个镜像启动新容器。

1. **提交当前容器为新镜像**:

docker commit <container_id> <new_image_name>

   这会基于当前容器的状态创建一个新的镜像。

2. **使用新镜像创建容器并挂载 Volume**:

docker run -d  --name <new_container_name>  -v /path/to/host/dir:/path/to/container/dir   <new_image_name>

这样,新的容器会保留旧容器的状态,同时挂载上指定的 Volume。

3. 配置nginx反向代理

3.1 进入nginx配置挂载目录/usr/local/nginx/conf,打开目录中配置文件vim nginx.conf,在http块中添加以下代码

http{
    server{
       #监听的端口
       listen 80;
       #字符格式
       charset utf-8;
       #当前的服务器ip
       server_name 192.168.112.135;
 
       location / {
          #要代理去哪个服务器的ip以及端口
          proxy_pass http://192.168.112.135:8080;
          #被代理服务器返回默认的响应头中的location头域以及refresh头域数值
          proxy_redirect default;
       }
    }
}

这样子就可以用本机的80端口代理其它服务器的8080端口。

location 指令说明
该指令用于匹配 URL。

语法如下:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配
成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字
符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location
块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

4. 配置nginx负载均衡

4.1 进入nginx配置挂载目录/usr/local/nginx/conf,打开目录中配置文件 vim nginx.conf,在http块中添加以下代码:

    
http{
    #upstream:up服务流
    #myserver:自定义服务流名称
    upstream myserver{
        #负载均衡五种策略,这里写的是iphash与权重,默认不写则为轮询策略
        ip_hash;
        #===========
        #需要代理的服务器ip地址以及端口,并且设置了权重
        server 115.28.52.63:8080 weight=1;
        server 115.28.52.63:8181 weight=1;
    }
 
    server{
       #监听的端口
       listen 80;
       #字符格式
       charset utf-8;
       #当前的服务器ip
       server_name 192.168.112.135;
 
       location / {
          #代理上边自定义的服务流名称
          proxy_pass http://myserver;
          #被代理服务器返回默认的响应头中的location头域以及refresh头域数值
          proxy_redirect default;
          #连接超时 默认为60秒
          proxy_connect_timeout 65s;
          #读取超时 默认为60秒
          proxy_read_timeout 65s;
          #发送超时 默认为60秒
          proxy_send_timeout 65s;
       }
    }
}

在 linux 下有 Nginx、LVS、Haproxy 等可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略):
1 、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2 、 weight
weight 代表权 , 重默认为 1, 权重越高被分配的客户端越多。

指定轮询几率, weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream server_pool {
server 192.168.5.21 weight = 10 ;
server 192.168.5.22 weight = 10 ;
}

3 、 ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。例如:

upstream server_pool {
ip_hash ;
server 192.168.5.21:80 ;
server 192.168.5.22:80 ;
}

4 、 fair (第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool {
server 192.168.5.21:80 ;
server 192.168.5.22:80 ;
fair ;
}

更多推荐