docker相关问题记录

本文是之前 docker从入门到实践 这篇文章的一个续集,用于记录docker在使用过程当中所遇到的一些问题与对应的解决方案。由于作者才疏学浅,难免会有错误或片面之处,还请谅解!

1. docker容器内vim命令中文乱码

进入docker容器内部后,利用vim命令打开文本文件,出现中文乱码。
解决方案1:在进入容器的时候,带上编码

docker exec -it container_id env LANG=C.UTF-8 /bin/bash

解决方案2https://www.jianshu.com/p/ae367138b7e3

2. Error starting userland proxy: listen tcp0.0.0.0:3306: bind: address already in use

重启docker容器内mysql的时候,出现该错误。
解决方案:重启docker服务

systemctl restart  docker

3. java连接docker容器内mysql

利用java连接docker容器内mysql,配置jdbc数据源时,配置如下数据源报错。

spring.datasource.url=jdbc:mysql://IP:3306/db_name?characterEncoding=utf8&useSSL=true

解决方案:将数据源配置中useSSL=true去掉

spring.datasource.url=jdbc:mysql://IP:3306/db_name?characterEncoding=utf8

4. 多个容器之间互相协作通信

当涉及到多个docker容器之间互相通信时,如容器A需要访问容器B中的mysql,同时容器A需要访问容器C中的某个接口,此时需要将多个容器连接在一起,或者置于同一网络中。docker提供了二种方式来实现。
方式一:--link方式(不推荐,未来会被弃用)

docker run -itd -p 8080:8080 --name docker_A --link docker_B:docker_b --link docker_C:docker_c java_web:v1.0
# run  运行容器
# -itd  后台运行
# -p 8080:8080  将容器中8080端口映射到宿主主机的8080端口
# --name docker_A  运行镜像后,容器的名字
# --link docker_B:docker_b  将容器B连接到容器A,并将容器B取别名为docker_b
# --link docker_C:docker_b  将容器C连接到容器A,并将容器B取别名为docker_c
# java_web:v1.0  镜像名和tag

方式二:--network方式(推荐)
只需将多个容器置于同一个网络中即可,因此需要创建一个桥接来桥接多个容器,使它们处于同一网络中。

docker network create -d bridge my-bridge

docker内置host、bridge和none三种网桥,可用如下命令查看,当新建网桥my-bridge后,其信息会添加到网桥列表中

[root@VM_1_7_centos ~] docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1fdbc8764188        bridge              bridge              local
8d92c7b5cac2        bridge              my-bridge           local
3b982758d982        host                host                local
3ade55f86109        none                null                local

在启动容器时,加上--network选项,并且名称相同,则容器A、B和C就会处于同一网络中,在程序中,可以直接用容器A、B或C的容器名字来访问该容器的对外接口即可。

docker run -itd --restart=always -p 6000:6000 --name docker_A --network my-bridge java_A:v1.0
docker run -itd --restart=always -p 3307:3306 --name docker_B --network my-bridge mysql_B:v1.0
docker run -itd --restart=always -p 6001:6001 --name docker_C --network my-bridge php_C:v1.0
# --restart=always  容器退出后,自动重启
# --network my-bridge  网桥名称,如果名称相同,则处于同一网络

例如:
如果容器A(java服务)需要访问容器B中的mysql数据库,则只需在配置文件application.properties中引用容器B的名字即可

spring.datasource.url=jdbc:mysql://docker_B:3306/db_name?characterEncoding=utf8

注意1:需要将useSSL=true去掉,参考第3小节;
注意2:此处访问的是容器B中的3306端口,因为3307端口是映射到宿主主机上的,容器B中对外提供的还是3306端口,而容器A和B处于同一网络,因此需要访问3306端口。而通过Navicat连接容器B中的mysql时候,需要3307端口。

5. docker容器重命名

docker rename old_container_name new_container_name

6. docker 镜像名与tag重命名

docker tag image_id new_image_name:new_tag

7. docker镜像导出压缩

导出镜像

docker save <myimage>:<tag> | gzip > <myimage>_<tag>.tar.gz

导入镜像

gunzip -c <myimage>_<tag>.tar.gz | docker load
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统...
    吧啦啦小汤圆阅读 55,637评论 4 18
  • 前言 前段时间的工作中有接触到接口测试,测试代码以maven工程的形式编写,使用testNG测试框架。工作中,每次...
    Ivanlfli阅读 9,339评论 7 24
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 5,828评论 0 7
  • 操作容器 docker的启动有两种启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(s...
    Ppnn13Yu阅读 3,401评论 0 0
  • 一、Docker简介 1、Docker是什么? 是一个开源的容器引擎,基于go语言开发 2、特点 轻量级,可移植的...
    chuckielove阅读 5,632评论 0 2

友情链接更多精彩内容