如果您想了解docker日常问题记录和docker常见问题的知识,那么本篇文章将是您的不二之选。我们将深入剖析docker日常问题记录的各个方面,并为您解答docker常见问题的疑在这篇文章中,我们将
如果您想了解docker 日常问题记录和docker常见问题的知识,那么本篇文章将是您的不二之选。我们将深入剖析docker 日常问题记录的各个方面,并为您解答docker常见问题的疑在这篇文章中,我们将为您介绍docker 日常问题记录的相关知识,同时也会详细的解释docker常见问题的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- docker 日常问题记录(docker常见问题)
- 167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
- docker images 备份并推送 docker hub 命令记录
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
- Docker Toolbox(boot2docker)若干问题记录
docker 日常问题记录(docker常见问题)
要想查看镜像的版本好 TAG, 需要在 docker hub 查看
地址如下:Docker Hub
一 . docker: Error response from daemon: Conflict. The container name "/rabbitmq" is already in use by co
说明:容器的名字已经被使用了,如果确实需要执行当前的命令,需要停止之前的容器,并且移除;
如执行如下命令出现上述问题:
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:latest
1. 输入 docker ps -a 查看容器
2. docker stop container-id 停止之前的容器
3. docker rm container-id 移除容器
之后再次执行上述启动容器的命令就可以正常启动了;
167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑
1.nginx服务器根目录问题
docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同
eg:
run一个niginx容器
<span>//80端口被占用,so...</span> $ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <span>1801</span>a32aab54 nginx <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago Up <span>2</span> minutes <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-></span><span>800</span>/tcp berserk_kare
进入容器内部
<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash root<span>@1801a32aab54</span><span>:/</span><span># </span>
查看nginx目录
<span># cd /etc/nginx/</span> conf<span>.d</span>/ koi-utf mime<span>.types</span> nginx<span>.conf</span> uwsgi_params fastcgi_params koi-win modules/ scgi_params win-utf
可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled
继续查看nginx配置
<span># cat /conf.d/default.conf</span><span>server</span> { listen <span>80</span>; server_name localhost; <span>#charset koi8-r;</span><span>#access_log /var/log/nginx/log/host.access.log main;</span> location / { root /usr/share/nginx/html; <span>index</span><span>index</span>.html <span>index</span>.htm; } <span>#error_page 404 /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span> error_page <span>500</span><span>502</span><span>503</span><span>504</span> /<span>50</span>x.html; location = /<span>50</span>x.html { root /usr/share/nginx/html; } <span>#...省略php-fpm配置,好长..</span> }
根目录配置: root /usr/share/nginx/html;
测试
<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" >index.html</span>
php-fpm配置相关
'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
docker images 备份并推送 docker hub 命令记录
docker commit -p ed58144ddc4c jenkins_jackwalliam
登陆自己的 docker hub 账号
docker login
给备份打上 tag
docker tag jenkins_jackwalliam ikbr5kh/ikbr5kh:jenkins_jackwalliam
推送到 docker hub
docker push ikbr5kh/ikbr5kh:jenkins_jackwalliam
后续该 docker 窗口还会安装更新,还需要更新到 docker 后续再补充。
Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run
/docker build
?
Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。
为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。
我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run
命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build
将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?
答案下面揭晓。
一、原理说明:/var/run/docker.sock
Docker 采取的是 Client/Server 架构,我们常用的 docker xxx
命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。
我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service
来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service
,能看到有这样一条语句:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock
)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。
因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。
要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".
二、示例
在容器内部使用宿主机的 docker,方法有二:
- 命令行方式:将
/usr/bin/docker
映射进容器内部,然后直接在容器内部使用这个命令行工具docker
- 需要的时候,也可以将
/etc/docker
文件夹映射到容器内,这样容器内的docker
命令行工具也会使用与宿主机同样的配置。
- 需要的时候,也可以将
- 编程方式:在容器内部以编程的方式使用 docker
- 通过 python 使用 docker: 在 Dockerfile 中通过
pip install docker
将 docker client 安装到镜像中来使用
- 通过 python 使用 docker: 在 Dockerfile 中通过
容器的启动方式也有两种,如下:
1. 直接通过 docker 命令启动
示例命令如下:
docker run --name <name> \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--user root \
<image-name>:<tag>
**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock
的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。
2. 使用 docker-compose 启动
docker-compose.yml 文件内容如下:
version: ''3.3''
services:
jenkins-master:
image: jenkinsci/blueocean:latest
container_name: jenkins-master
environment:
- TZ=Asia/Shanghai # 时区
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home # 将容器中的数据映射到宿主机
- /usr/bin/docker:/usr/bin/docker # 为容器内部提供 docker 命令行工具(这个随意)
- /var/run/docker.sock:/var/run/docker.sock # 容器内部通过 unix socket 使用宿主机 docker engine
user: root # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
restart: always
然后通过 docker-compose up -d
即可后台启动容器。
Docker 中的 uid 与 gid
通过上面的操作,我们在容器内执行 docker ps
时,还是很可能会遇到一个问题:权限问题。
如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock
的 onwer 就是 root.
但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock
了。
解决办法:
方法一(不一定有效):在构建镜像时,最后一层添加如下内容:
# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
&& usermod -aG docker <your_user_name>
这样我们的默认用户,就能使用 docker 命令了。
P.S.
999
不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过docker run -u root
启动容器吧。(或者在docker-compose.yml
中添加user: root
属性)
参考
- Docker in Docker - 王柏元
Docker Toolbox(boot2docker)若干问题记录
一、指定启动时挂载的boot2docker.iso文件
新安装的window下的docker环境是需要去国外网站下载最新的docker镜像,而国内通常下载不下来,但在boot2docker目录中,是有一份iso镜像
修改启动时start.sh文件,找到下面的脚本,其中--virtualBox-boot2docker-url=是新增加的参数,注意双引号和路径为linux路径
"${DOCKER_MACHINE}" create -d virtualBox --virtualBox-no-vtx-check --virtualBox-boot2docker-url="./boot2docker.iso" $PROXY_ENV "${VM}"
二、挂载window的目录,方便传输保存文件
在vm中做如下配置,会在启动时自动挂载到根目录下
三、个性化的配置文件保存
boot2docker启动时是从iso镜像文件开始,也就意味着里面的内容都是只读,不可修改,举个例子:通常配置docker仓库加速镜像,是在/etc/docker/daemon.json中,但这个位置是iso中的目录,修改后,重启会恢复原来的内容。
需要如下操作:
进入虚拟的docker bash后,编辑 /var/lib/boot2docker/profile文件,添加如下配置
--registry-mirror==https://ns2wtlx2.mirror.aliyuncs.com
重启虚拟机生效。
但是配置的内容是如何保存的,查看系统挂载情况
root@default:/mnt/sda1/var/lib/boot2docker# df -h
Filesystem Size Used Available Use% Mounted on
tmpfs 896.1M 227.5M 668.6M 25% /
tmpfs 497.8M 0 497.8M 0% /dev/shm
/dev/sda1 17.9G 44.8M 16.9G 0% /mnt/sda1
cgroup 497.8M 0 497.8M 0% /sys/fs/cgroup
share 189.0G 61.4G 127.6G 32% /share
/dev/sda1 17.9G 44.8M 16.9G 0% /mnt/sda1/var/lib/docker
sda1挂载到/var/lib/boot2docker/目录下,而我们的sda1是vm建立的一个disk虚拟盘
今天关于docker 日常问题记录和docker常见问题的讲解已经结束,谢谢您的阅读,如果想了解更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、docker images 备份并推送 docker hub 命令记录、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、Docker Toolbox(boot2docker)若干问题记录的相关知识,请在本站搜索。
本文标签: