目录

docker使用篇

[TOC]

Cannot connect to mysql database: Access denied #51

Another possible resolution to the ‘access denied’ issue is provided in this issue: #241. In short, add MYSQL_ROOT_HOST=% as an environment variable.

又出现了…上述方法没管用,再试试另一种

1
2
$ dcp -f mysql-standalone.yml stop
$ dcp -f mysql-standalone.yml rm -v

docker安装vim

1
2
apt-get update
apt-get install vim

docker network

ERROR: Pool overlaps with other one on this address space

错误原因:networks参数下手动指定了subnet地址,此地址发生了冲突。

解决:

1
2
3
docker network ls # 查看docker网卡
docker network inspect <网卡id> # 查看具体信息,找到与subnet冲突的是哪个
docker network rm <网卡id> # 删除冲突的网卡

之后重新运行docker-compose up -d命令即可。

docker cp

**docker cp :**用于容器与主机之间的数据拷贝。

语法

1
2
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS说明:

  • **-L :**保持源目标中的链接

实例

将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。

1
docker cp /www/runoob 96f7f14e99ab:/www/

将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。

1
docker cp /www/runoob 96f7f14e99ab:/www

将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。

1
docker cp  96f7f14e99ab:/www /tmp/

拷贝文件和拷贝文件夹

1
2
3
4
5
SRC_PATH *Not* end with /.
The source directory is copied into this directory

SRC_PATH end with /.
The content of the source directory is copied into this directory

docker-compose查看所有容器ip

显示所有容器ip地址

1
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

~/.bashrc 中写一个 bash 函数:

1
2
3
function docker_ip() {
	docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}

source ~/.bashrc 然后:

1
2
3
4
5
6
$ docker_ip
/nginx - 172.30.0.6
/nacos3 - 172.30.0.3
/nacos1 - 172.30.0.5
/nacos2 - 172.30.0.4
/mysql - 172.30.0.2

参考地址

docker镜像没有ifconfig、ping命令

解决

1
2
3
apt-get update # 更新仓库
apt install net-tools       # ifconfig 
apt install iputils-ping     # ping

镜像操作

操作 命令 说明
检索 docker search 关键字 eg:docker search redis 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。
拉取 docker pull 镜像名:tag :tag是可选的,tag表示标签,多为软件的版本,默认是latest
列表 docker images 查看所有本地镜像
删除 docker rmi image-id 删除指定的本地镜像

容器操作

 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
1、搜索镜像
[root@localhost ~]# docker search tomcat
2、拉取镜像
[root@localhost ~]# docker pull tomcat
3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest
4、docker ps  
查看运行中的容器
5、 停止运行中的容器
docker stop  容器的id
6、查看所有的容器
docker ps -a
7、启动容器
docker start 容器id
8、删除一个容器
 docker rm 容器id
9、启动一个做了端口映射的tomcat
[root@localhost ~]# docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口    主机端口:容器内部的端口

10、为了演示简单关闭了linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
11、查看容器的日志
docker logs container-name/container-id

更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/

每个镜像设置了哪些参数,例如mysql需要设置密码可以查看镜像具体的文档,在hub 搜索镜像,进入tag页。

查看远程Repo版本

写一个shell脚本,需要先安装好jq工具

1
2
#!/bin/sh
curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$@/tags/" | jq '."results"[]["name"]' |sort

使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ dt rabbitmq
"3-alpine"
"3-management-alpine"
"3.8-alpine"
"3.8-management-alpine"
"3.8.9-alpine"
"3.8.9-management-alpine"
"alpine"
"latest"
"management"
"management-alpine"

docker logs查看容器日志

通过docker logs命令可以查看容器的日志。

命令格式:

1
2
3
4
5
6
7
8
$ docker logs [OPTIONS] CONTAINER
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

例子:

查看指定时间后的日志,只显示最后100行:

1
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID

查看最近30分钟的日志:

1
$ docker logs --since 30m CONTAINER_ID

查看某时间之后的日志:

1
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID

查看某时间段日志:

1
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

查看容器配置信息

1
2
3
$ docker inspect container
$ docker inspect -f {{".HostConfig.Binds"}} 9b
[/tmp/mysql/data:/var/lib/mysql /tmp/mysql/conf:/etc/mysql /tmp/mysql/log:/var/log/mysql]

打开新的终端

attach只会进入已打开的终端

1
$ docker exec -it <container> bash 打开一个新的终端

挂数据卷

1
$ docker run -it -v /tmp/com.eh/share:/tmp/com.eh/share --privileged e5

配置端口映射

  1. 生成新镜像的笨方式
1
2
3
4
5
6
7
8
# 1. 关机
$ docker stop 1b
# 2. 生成镜像
$ docker commit 1b 1a
# 3. 启动镜像
$ docker run -it -p 6379:6379 -v /tmp/com.eh/share:/tmp/com.eh/share --privileged 1a
# 4. 退出,以zsh重新进入
$ de 35 zsh
  1. 修改配置文件中docker容器的端口映射,比较灵活但需要重启docker引擎

    参考:https://my.oschina.net/fxtxz2/blog/3078882

    1
    2
    3
    4
    5
    6
    
    # step1. 查看容器ID
    $ docker ps -a
    # step2. mac上docker容器比较特殊,是安装在linux内核上,所以需要使用screen进入linux内核
    $ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    # step3 进去之后默认是空白页面,需要按下Enter:
    docker-desktop:~# cd /var/lib/docker/containers/1b2a17fb86da5b8084e3033a8a9be8619ed70f85a295fba6b0ac22556fc50ebd/
    

    https://gitee.com/lienhui68/picStore/raw/master/null/image-20200927210016728.png

    step4: 需要修改上述两个文件,修改方式是使用cat命令复制到sublime中格式化处理,处理完毕再压缩成一行复制回来。处理之前记得备份。

    • config.v2.json

      在下图中所示位置增加这一段:

      1
      2
      3
      4
      5
      
      "ExposedPorts": {
            "6379/tcp": {},
            "6380/tcp": {},
            "6381/tcp": {}
      },
      

      https://gitee.com/lienhui68/picStore/raw/master/null/image-20200927210434310.png

    • hostconfig.json

      在下图所示位置增加这一段:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      
      "PortBindings": {
         "6379/tcp": [
              {
                  "HostIp": "",
                  "HostPort": "6379"
              }],
         "6380/tcp": [
              {
                  "HostIp": "",
                  "HostPort": "6380"
              }],
         "6381/tcp": [
              {
                  "HostIp": "",
                  "HostPort": "6381"
              }]
        },
      

      https://gitee.com/lienhui68/picStore/raw/master/null/image-20200927210538253.png

      step5: 上述两个文件中json改动后压缩成一行再复制回去,方式是vi进去删除一行再粘贴

      step6: 退出screen ctrl + a + k 最后按y确认既可以kill掉这个screen

      step7: 重启docker desktop

      一定需要重启docker引擎,如果跳过这一个步骤就会出现hostconfig.json修改的内容被还原的问题。

      step8: 查看容器是否存在,防止修改错误导致容器不显示

      https://gitee.com/lienhui68/picStore/raw/master/null/image-20200927211412059.png

      step9: 启动1b容器

      1
      2
      
      $ docker start 1b
      1b
      

      step10: 检查容器

      1
      2
      3
      4
      
      $ docker container port 1b
      6379/tcp -> 0.0.0.0:6379
      6380/tcp -> 0.0.0.0:6380
      6381/tcp -> 0.0.0.0:6381
      

      ok,大功告成。

      端口映射是ok了,但是redis还需要设置允许外部访问

      1
      2
      3
      4
      
      # bind 127.0.0.1
      protected-mode no
      1. 注释 bind 127.0.0.1
      2. 将 protected-mode yes 改成no
      

      参考:

      MacOS下/var/lib/docker 的存放位置

      修改docker容器的端口映射(Mac版)

设置别名

1
2
$vim ~/.bash_profile
$source ~/.bash_profile
1
alias de='docker exec -it'

容器中跑Centos8镜像,执行systemctl报错

1
2
3
System has not been booted with systemd as init system (PID 1). Can't operate.

Failed to connect to bus: Host is down

如图:

https://gitee.com/lienhui68/picStore/raw/master/null/image-20200930005733169.png

解决:

1
2
3
4
5
6
7
8
9
1.容器的entrypoint需要设置init
ENTRYPOINT ["/sbin/init"]
2.pod权限
securityContext:
	privileged: true
# 可能会带来新的问题,如下参考
$ sudo docker run  -d -p 8120:8120 -p 2220:2220 -p 3326:3326 -ti --name homepage02 --link homepage01:homepage01 --privileged  -ti -e "container=docker"  -v /sys/fs/cgroup:/sys/fs/cgroup web /sbin/init
# 重新生成镜像然后执行如下
$ docker run -it -p 3306:3306 -v /tmp/com.eh/share:/tmp/com.eh/share --privileged e1 /sbin/init

参考:https://www.cnblogs.com/colder219/p/6679255.html

The paths xxx are not shared from OS X and are no

在MAC允许共享的目录(https://docs.docker.com/docker-for-mac/) https://gitee.com/lienhui68/picStore/raw/master/null/image-20200930143556928.png