[TOC]
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说明:
实例
将主机/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
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
|
-
修改配置文件中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/
|

step4: 需要修改上述两个文件,修改方式是使用cat命令复制到sublime中格式化处理,处理完毕再压缩成一行复制回来。处理之前记得备份。
-
config.v2.json
在下图中所示位置增加这一段:
1
2
3
4
5
|
"ExposedPorts": {
"6379/tcp": {},
"6380/tcp": {},
"6381/tcp": {}
},
|

-
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"
}]
},
|

step5: 上述两个文件中json改动后压缩成一行再复制回去,方式是vi进去删除一行再粘贴
step6: 退出screen ctrl + a + k 最后按y确认既可以kill掉这个screen
step7: 重启docker desktop
一定需要重启docker引擎,如果跳过这一个步骤就会出现hostconfig.json修改的内容被还原的问题。
step8: 查看容器是否存在,防止修改错误导致容器不显示

step9: 启动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
|
如图:

解决:
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/) 