分类 Docker 下的文章

在某些情况下,我们可能希望让多个容器通过不同的ip地址或不同的主机名共享同一个服务。
例如,在微服务架构中,每个服务可以作为一个容器独立运行,但可能会有多个实例与同一个端口进行通信。

使用Docker网络共享服务
首先,我们创建一个Docker网络,允许多个容器共享服务。随后,我们可以运行多个容器并让它们彼此通讯。
创建docker网络
docker network create my_network
启动两个Nginx容器
docker run -d name nginx1 --network my_network nginx
docker run -d name nginx2 --network my_network nginx
测试网络可达性
docker exec -it nginx1 ping nginx2
验证服务可用性
之需使用curl命令
docker exec -it nginx1 curl http://nginx1
docker exec -it nginx2 curl http://nginx2

使用负载均衡器
另一种常见的方法是使用负载均衡器,例如Nginx或HAProxy,来分发流量到多个后端容器。
创建一个Nginx负载均衡器
我们可以创建一个新的Nginx容器,作为负载均衡器,监听在主机的8080端口,然后将流量分发到其他两个Nginx容器:

#nginx.conf
http{
upstream backend{
server nginx1:80;
server nginx2:80;
}
server{
listen 8080;
location /{
proxy_pass http://backend;
}
}
}

启动Nginx负载均衡器
将上面的配置文件保存为nginx.conf,并通过Dockerfile构建自己的Nginx负载均衡器:

#Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

构建并运行负载均衡器:

docker build -t my-nginx-lb
docker run -d -name nginx-lb --network my_network -p 8080:8080 my-nginx-lb

测试负载均衡
http://localhost:8080实现负载均衡,验证流量是否能被成功转发到不同的Nginx实例。

本地化是指不同地区用户在键盘上输入不同语言的字符集。例如 en_US 表示美国英语字符集,因此只有正确设置了服务器的字符集,服务器才能理解用户的输入字符。setlocale 命令可以帮助用户来设置本地化字符集。

出现以上问题是因为服务器无法理解 en_US.UTF-8 字符集,首先,我们需要检查系统上是否已经安装了所需的locale。可以通过以下命令查看已安装的locale:
locale -a
确保在输出中能够找到 "en_US.UTF-8",如果没有,我们需要在服务器上生成 en_US.UTF-8 字符集:
sudo locale-gen en_US.UTF-8
然后使用最新生成的字符集更新本地仓库:
sudo dpkg-reconfigure locales
最后更新 /etc/default/locale 文件,例如更新前的文件内容为:
LANG=C.UTF-8
更新后:
lC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

环境变量 LC_ALL 会覆写所有的本地化设置(在某些情况下 $LANGUAGE 不会被覆写),例如 LC_NAME, LC_ADDRESS 等等。设置 LC_ALL=en_US.UTF-8 表示所有的本地化设置都使用 en_US.UTF-8。

重新登录服务器,warning 警告不再出现,问题解决

如果是容器,也是需要重启容器才能生效

启动docker服务
systemctl start docker

查看Docker状态
systemctl status docker

设置Docker开机自启
systemctl enable docker

禁用Docker开机自启
systemctl disable docker

重新启动Docker服务
systemctl restart docker

查看Docker信息
docker info

停止docker服务
systemctl stop docker

加载已有的镜像到Docker中:
docker load < xxx.tar # xxx.tar表示镜像文件

查看Docker内的镜像列表
docker images

查看容器列表

格式

docker ps [参数]
docker ps # 查看当前系统中正在运行的容器列表

参数

-a : 查看系统中所有的容器。
-q : 仅显示容器的ID

创建容器

格式

docker run [参数] [镜像名称] [运行容器的启动命令]

参数

-d : 以守护进程的方式运行一个容器
    docker run -d [镜像名称] [cmd]
--name : 指定容器的名称
    docker run -d --name [容器名称] [镜像的名称] [cmd]
-p : 指定端口映射
    docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
-P :随机端口映射
    docker run -d -P [镜像名称] [cmd]
-i : 打开标准输出
-t : 创建一个伪终端
    docker run -it [镜像名称] [cmd]
-v : 挂载目录到容器中
    docker run -v 宿主主机目录:容器内目录  [镜像名称] [cmd]
--rm : 容器生命周期结束时立即删除
    docker run --rm [镜像名称] [cmd]
-e : 在容器中创建一个环境变量
    docker run -e NAME=Centos -d [镜像名称] [cmd]
--link : 连接上一个容器,实现网络互通
    docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
-h : 设置容器主机名
    docker run -h "主机名"  [镜像名称] [cmd]

docker run 运行流程
1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
3、返回容器ID

进入容器
容器启动后,需要进入容器做相关的操作,这个时候就需要进入到容器内部。

容器ID可以通过查看容器列表获得
docker attach [容器ID] # 个人最常用
docker exec -it [容器ID] /bin/bash # 这种方式也是可以的

删除镜像和容器
删除镜像
docker rmi [镜像ID] # 如果镜像有关联容器,将执行失败
docker rmi -f [镜像ID] # 强制删除镜像,同时删除关联的容器

删除容器
docker rm [容器ID] # 删除容器,如果容器在运行貌似也是删不掉的
docker rm -f [容器ID] # 强制删除

不进入容器情况下在容器内执行命令
docker exec -d [容器名称] /bin/bash -c [需要执行的命令] -g "daemon off;"

示例:
docker exec -d my_container_name /bin/bash -c "nohup java -jar /home/my/xxx.jar > /home/my/log/xxx.log 2>&1 &" -g "daemon off;"