0%

Docker汇总

参考1
参考2

常用命令

命令大全

容器

列出所有容器

1
docker container ls

查看所有容器,包括关闭的

1
2
docker container ls --all
docker ps -a

删除具体的容器,根据container id

1
docker container rm c8faeffaaa62

查看容器IP

1
docker inspect 容器ID | grep IPAddress

启动某个容器

1
docker restart 1b4671904bfa

查看容器内存使用情况(支持多个同时查)

1
docker stats containerName1 containerName2

查看日志

1
docker logs -f 122482b4b37f

进入容器

1
2
sudo docker exec -it containerName bash
sudo docker attach 44fc0f0582d9

docker限制容器的内存使用

https://blog.csdn.net/qq_37611270/article/details/97243704

状态信息

列出docker name

1
sudo docker inspect -f='{{.Name}}' $(sudo docker ps -a -q)

列出docker ip

1
sudo docker inspect -f='{{.NetworkSettings.IPAddress}}' $(sudo docker ps -a -q)

列出所有容器对应的名称,端口,及ip

1
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)

查看状态

1
systemctl status docker

数据卷

1
2
docker inspect 容器id
# 可以查看容器信息 “HostConfig下的Binds 可以看到数据卷绑定 Mounts下Souce和Destination也可以看到数据卷绑定信息”

清理数据

自动清理空间

1
docker system prune

Mysql

参考
目录映射时,容器里面的目录会在容器启动的时候自动创建。

1
2
3
4
5
6
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=raubbhWy \
-d mysql:5.7

进入docker本地连接mysql客户端

1
2
sudo docker exec -it mysql bash
mysql -uroot -p123456

Fastdfs

season/fastdfs
参考1
参考2
参考3

redis

https://www.runoob.com/docker/docker-install-redis.html

rabbitmq

1
2
docker pull rabbitmq:management
docker run -d --hostname my-rabbit --name some-rabbit -p 15555:15672 rabbitmq:management

默认账号密码:guest和guest

docker跑SpringCloud微服务

dockerfile-maven

Dockerfile

在Docker中创建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile基础知识
Dockerfile命令大全

命令

EXPOSE

https://blog.csdn.net/qq_17639365/article/details/86655177

VOLUME

https://www.cnblogs.com/ExMan/p/12017896.html

  • 通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。
  • 通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
  • 还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
    1
    2
    3
    4
    #test
    FROM ubuntu
    MAINTAINER hello1
    VOLUME ["/data1","/data2"]

上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.

我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"Mounts": [
{
"Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
"Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
"Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
}
]

apt-get更换国内源解决Dockerfile构建速度过慢

ubuntu和debian的镜像源都要换

1
2
3
4
RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get clean
RUN apt-get update

或者:

1
2
3
FROM ubuntu:20.04
RUN sed -i 's/ports.ubuntu.com/mirror.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
RUN apt-get install vim

https://www.cnblogs.com/dakewei/p/12783717.html

163的镜像

1
2
3
4
5
6
#更新apt-get源 使用163的源
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list && \
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list

docker-compose

docker-compose.yml文件详解
基础
参考1

安装

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果从github拉下来安装之后无法执行docker-compose命令的话,可以采用本机电脑下载之后上传到服务器,在chmod修改可执行权限就可以了。

命令

后台执行

1
docker-compose up -d

docker-compose中解决depends_on无效问题

1
2
3
RUN apt-get -q update && apt-get -qy install netcat
# docker-compose.yml 加上下面
command: sh -c './wait-for.sh kiwi-microservice-local:5001/actuator/info -- echo kiwi-word-biz already started'

http://www.zyiz.net/tech/detail-98533.html
https://github.com/Eficode/wait-for

Mac上跑docker

https://www.runoob.com/docker/macos-docker-install.html

docker.service的配置

https://www.cnblogs.com/nihaorz/p/12131873.html

更换国内的镜像

https://blog.csdn.net/u012081441/article/details/104553145/
https://blog.csdn.net/s_lisheng/article/details/79871086

在docker跑nginx的vue项目

https://www.jianshu.com/p/422b61100273

nginx80端口被占用修改

https://jingyan.baidu.com/article/3aed632efb150a701080912f.html

验证nginx配置

1
./sbin/nginx -t

各种配置

https://www.jqhtml.com/34815.html

网络

1
2
docker network ls
docker network inspect bridge

https://www.cnblogs.com/chenpython123/p/10823879.html

Docker根据名称查询容器ID镜像ID并停止删除

https://blog.csdn.net/zimou5581/article/details/94012682

Problem Solution

bash: vi: command not found

1
2
3
docker exec -it <container> bash
apt-get update
apt-get install vim

Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

网上的解决方案

Current command vanished from the unit file, execution of the command list won’t be resumed.

可能是有docker的相关进程没有杀干净。

1
2
ps -ef|grep docker
kill -9 pid

远程2375连接不上

1
vi /usr/lib/systemd/system/docker.service

vim进入命令行模式输入?ExecStart,找到如下一行:

1
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock \

在后面加上-H tcp://0.0.0.0:2375

1
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

1
systemctl daemon-reload
1
service docker restart

之后要注意重启之前的容器。

ERROR: Version in “./docker-compose.yml” is invalid. You might be seeing this error because you’re using the wrong Compose file version. Either specify a supported version (e.g “2.2” or “3.3”)

把docker-compose.yml里面的version改一下,改成2.2或3.3(根据提示改)

docker 启动 nginx 访问不了的问题

如果容器的nginx服务没有启动

1
2
3
#  进入容器
/usr/sbin/nginx
# 看下报什么错

vue.config.js设置代理之后,nginx反向代理 404

https://zhuanlan.zhihu.com/p/60833019
/etc/nginx/conf.d/default.conf

nginx关键配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

location /auth {
proxy_pass http://kiwi-microservice:9991;
}

location /wordBiz {
proxy_pass http://kiwi-microservice:9991;
}

location /code {
proxy_pass http://kiwi-microservice:9991;
}

Published ports are discarded when using host network mode

host的网络模式不能-p映射端口

OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused “exec: \”bash\”: executable file not found in $PATH”: unknown

三种模式选择一种试试:

1
2
3
docker exec -it 1e33b26152e1 /bin/sh
docker exec -it 1e33b26152e1 bash
docker exec -it 1e33b26152e1 sh

mkdir: can’t create directory ‘/tmp’: File exists

Dockerfile里面RUN命令创建文件夹的时候注意不要和系统同路径,不然会报错。

openjdk:8-jdk-alpine进入容器

用传统的docker exec -it ? bash进不去要改成:

1
docker exec -it ? /bin/sh

https://stackoverflow.com/questions/40944479/how-to-use-bash-with-an-alpine-based-docker-image/40944512
查看其java_home:

1
docker-java-home

启动容易报错

可以通过查看docker状态,看看报错的log:

1
systemctl status docker -l

jmap等命令在openjdk:8-jdk-alpine不灵

容器修改了配置启动不来的处理方法

可以通过docker inspect xxxid查看GraphDriver的容器依赖物理文件目录,进去找到修改过的配置文件改回来