docker相关

本文最后更新于 2023年9月22日。

关于映射文件夹

查看和移除docker映射文件夹

[root@iZ8vbajg9wo8iwynfb1lgeZ dc1]# docker volume ls
DRIVER    VOLUME NAME
local     d70d4c146eba60e8eb616b8d68f58f6254075a9f30d18ff7584ed424cc418667
local     dc1_cheveretoconfig
local     dc1_cheveretodata
local     dc1_djangocmsapp
local     dc1_djangocmsdata
[root@iZ8vbajg9wo8iwynfb1lgeZ dc1]# docker volume rm d70d4c146eba60e8eb616b8d68f58f6254075a9f30d18ff7584ed424cc418667
d70d4c146eba60e8eb616b8d68f58f6254075a9f30d18ff7584ed424cc418667

docker查询容器所有文件夹映射

docker inspect easyimage | grep Mounts -A 20

docker daemon文件生效

sudo systemctl daemon-reload 
sudo systemctl restart docker

更新服务器时间-bash: ntpdate: 未找到命令

 yum install ntpdate
ntpdate -u ntp.api.bz

221018

docker在pull镜像的时候经常出现头一天晚上怎么都不行,第二天一早忽然就可以了。

docker查看所有容器占用的内存

docker stats

获取帮助

docker stats --help
# 获取容器ID
docker ps => 3b7fa46d9d43
# 根据容器ID获取对应的进程
docker top 3b7fa46d9d43 => 179733
# 查看进程占用的内存
top -p 179733
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
179733 root      20   0   23.8g   4.2g  11108 S   2.7  6.6  79:20.32 java

PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称

关于dockerfile的RUN与层

多个RUN形成多个层便于复用,如果上一层没有移除文件的话在体积上不会差太多
https://segmentfault.com/q/1010000042803599?utm_source=sf-similar-question

解决docker无法拉取镜像问题

报错:

docker: Get "https://registry-1.docker.io/v2/library/hello-world/manifests/sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4": net/http: TLS handshake timeout.

解决办法

[root@docker-registry ~]# yum install bind-utils                          // 安装dig工具
[root@docker-registry ~]# dig @114.114.114.114 registry-1.docker.io
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @114.114.114.114 registry-1.docker.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51198
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;registry-1.docker.io.          IN      A
;; ANSWER SECTION:
registry-1.docker.io.   31      IN      A       34.206.236.31
registry-1.docker.io.   31      IN      A       54.175.43.85
registry-1.docker.io.   31      IN      A       34.205.207.96
registry-1.docker.io.   31      IN      A       34.233.151.211
registry-1.docker.io.   31      IN      A       52.70.175.131
registry-1.docker.io.   31      IN      A       34.200.28.105
registry-1.docker.io.   31      IN      A       54.165.149.19
registry-1.docker.io.   31      IN      A       34.201.236.93
;; Query time: 10 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Wed Oct 31 11:18:55 CST 2018
;; MSG SIZE  rcvd: 177
选择上面命令执行结果中的一组解析放到本机的/etc/hosts文件里做映射
[root@docker-registry ~]# vim /etc/hosts
54.175.43.85    registry-1.docker.io
接着再进行docker pull镜像下载操作
[root@docker-registry ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
aeb7866da422: Pull complete
Digest: sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b
Status: Downloaded newer image for docker.io/centos:latest
[root@docker-registry ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos     latest              75835a67d134        3 weeks ago         200 MB

第二天正常pull

[root@iZ8vbajg9wo8iwynfb1lgeZ ~]# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/

补充
有时候改hosts也不行,最好新建一个/etc/docker/daemon.json文件,写入以下内容:

{"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://pee6w651.mirror.aliyuncs.com","https://registry.docker-cn.com","http://hub-mirror.c.163.com"]}

然后运行

systemctl daemon-reload
systemctl restart docker

重启服务

这样之后能成功下载的几率更高。

设置交换分区切换值为100后启动docker出问题

221206
设置交换分区切换值为100后启动docker出问题

Failed to add /run/systemd/ask-password to directory watch: No space left on device

解决办法

立刻见效的方式: 在命令行添加监控空间

sudo -i
echo 1048576 > /proc/sys/fs/inotify/max_user_watches
exit
或者也可以修改配置文件,使监控长期有效:

sudo vim /etc/sysctl.conf
然后在文件末尾添加:

fs.inotify.max_user_watches=1048576
保存退出,然后再输入启动docker命令即可。

使用docker-compose创建容器会删除另一个已经运行的容器

找到原因了,service名成重复了。

docker解决exited with code 0

Attaching to wagtail
wagtail exited with code 0

解决办法:
环境:docker (docker-compose) + Ubuntu + ···(其他的不重要)
问题:运行 docker-compose up后,Ubuntu镜像构建成功,但是又马上退出并显示 exited with code 0
原因:docker容器执行任务完成后就会处于exited状态
解决

1. 在 yml 文件的 Ubuntu镜像参数中加上 stdin_open: true | tty: true 这两行参数,代码如下(最后两行),其中 stdin_open 相当于 run 命令中的 -d,其中 tty 相当于 run 命令中的 -i

ubuntu-php-ext:
build: ./build/
volumes:
- php-ext:${EXTSPACES}
stdin_open: true
tty: true

2. 运行一个一直执行的命令,这个根据自己的情况去写就可以了

docker容器

docker容器下PHP有自己特有的安装扩展方法:
docker-php-source //在容器中创建/usr/src/php文件夹
docker-php-ext-install //安装并启动扩展(常用)
docker-php-ext-enable //启动PHP扩展
docker-php-ext-configure //添加扩展自定义配置,和enable搭配使用

安装zip扩展所需的依赖扩展
apt-get update && apt-get install -y zlib1g-dev && apt-get install -y libzip-dev

安装并启动zip扩展
docker-php-ext-install zip

使用以下命令清理已经停止运行的docker容器

docker rm $(docker ps --all -q -f status=exited)

Nginx配置位置

/var/lib/docker/volumes/compose_lnmp_nginx-config/_data/conf.d/default.conf

启动LNMP

cd /home/admin/compose_lnmp
docker-compose up -d

修改yml之后需要build才能生效

docker-compose build

重启LNMP

cd /home/admin/compose_lnmp
docker-compose restart

停止LNMP

docker-compose down

查看容器情况

docker container ls

将sql文件导入docker中的MySQL

docker中启动的mysql导入sql文件,步骤如下:
拷贝SQL文件到mysql容器中
登陆mysql控制台执行source sql文件;
当然导入导出的姿势有很多种,感兴趣的可以评论到下方交流
我不是主要搞数据库的,不过还是很喜欢数据库,所以过多的就不写了,以免误导
因为我将要导入的SQL文件需要先创建相关的数据库,所以下面操作会多了一步
# 1.拷贝SQL文件到mysql容器中
docker cp yyy.sql mysql:/yyy.sql
docker container exec -it mysql bash
mysql -u root -p
# 2. 创建数据库
mysql> create database yyy;
mysql> use yyy;
# 3.登陆控制台执行source 命令
mysql> source yyy.sql

进入Nginx

docker container exec -it nginx bash

查看日志

docker logs nginx

docker中arg和env的区别是什么

在使用 docker-compoe 构建镜像的时候会感觉 ARG 和 ENV 的作用很相似, 但是这两个存在就肯定有它的原因

它们起作用的时机

  • arg 是在 build 的时候存在的, 可以在 Dockerfile 中当做变量来使用

  • env 是容器构建好之后的环境变量, 不能在 Dockerfile 中当参数使用

从这里可以看出来 ARG 就是专门为构建镜像而生的