Docker使用问题集

接触Docker时间不长,折腾不少。实际上Docker还是蛮简单的,基于Go开发,容器化资源。

第一次创建镜像过程中遇到些问题,我在这里记录,希望能帮助到别人和自己。

国内如何加速拉取Docker镜像

通过 Docker 镜像加速,国内能够快速访问最流行的 Docker 镜像。国内用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker 化应用。

Docker-runc not installed on system

CentOS通过命令安装Docker时,并没有安装完整。一般在重新安装Docker后出现该问题。 只运行某镜像时,出现如下错误信息:

docker run docker.io/ysqi/gotestreport
/usr/bin/docker-current: Error response from daemon: shim error: docker-runc not installed on system.

咋回事?原本好好的怎么就出问题了?原来是命令卸载Docker并没有卸载干净,导致重装或更新Docker后出问题。

这个在红帽上有一个Issue:https://access.redhat.com/solutions/2876431 有说明此问题,暂时只能是新建一个link到最终版本:

cd /usr/libexec/docker/
ls -all
sudo ln -s docker-runc-current docker-runc 

Jenkins: Can’t connect to Docker daemon

当Jenkins的Pipeline基于Docker运行时,提示此错误信息:

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

这是因为CentOS安装Docker时使用的独立的用户组Docker,而Jenkins运行也是独立的用户Jenkins,需要将Jenkins用户添加到Docker的用户组中:

sudo gpasswd -a jenkins docker

再重启Docker服务

systemctl daemon-reload
systemctl restart docker

最后重启Jenkins

sudo service jenkins restart

Done!

Docker: 如何将本地文件载入Docker容器中

运行Docker镜像时,是支持参数配置的。参数-v是表示映射本地目录到Docker容器中。

-v, 
--volume list Bind mount a volume 
--volume-driver string Optional volume driver for the container 
--volumes-from list Mount volumes from the specified container(s) 预先设置将本机路径

例如:

export src=$HOME/goproject/ysqi/com
export target=/go/src/github.com/ysqi/com

再启动容器时设置挂载:

docker run -v $src:$target  ysqi/gotestreport

表示什么意思呢?即将本地的目录$src映射到Docker容器中的一个目录$target, 在Docker容器内部访问/go/src/github.com/ysqi/com,实际上就是在访问本机目录:$HOME/goproject/ysqi/com。

Docker实际上做了一个 volume 映射,就想VM上添加了一个映射盘。那如何把当前目录映射到Docker容器的指定位置?

docker run -v ${pwd}:/go/src/pkg ysqi/gotestreport

这样就把本地的当前目录,映射到了/go/src/pkg 目录。

Docker: 如何在主机和容器间拷贝文件

上面所说得中使用-v 参数将主机与容器中相关目录联系在一起(挂载),所以我们可以用这个通道将想要互相拷贝的数据放入其中,这样就可以用 cp 命令来复制文件了。

除了这个办法,我们还可以分别用不同的命令来拷贝数据。

docker cp -h查看命令使用

Flag shorthand -h has been deprecated, please use --help

Usage:	docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
	    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Copy files/folders between a container and the local filesystem 

以Nginx为例:先运行Nginx容器:

docker run -p 8080:80 -d nginx
a54b77dbef541a7fce911b3298b32f4d4884665f88d2d23b690181a3dd684439

本机测试Nginx访问:curl http://localhost:8080,正常。

再从主机拷贝文件到容器:

docker cp  ./test a54b77dbef54:/usr/share/nginx/html

此时将主机当前目录下的 test 文件夹全部拷贝到容器内部的 /usr/share/nginx/html目录下。

反之,则可将文件或文件夹从容器内部拷贝到主机指定目录:

docker cp  a54b77dbef54:/etc/nginx/conf.d/default.conf .

此时,便将容器内部的nginx默认配置文件拷贝的主机的当前目录下。

关于作者

虞双齐,一名全栈开发工程师,#热爱编程、#工具控、#爱读书、#宅男

活跃在 知乎,开源项目在Github,博文分享在 个人博客上。