rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:262: starting container process caused “process_linux.go:73

[root@docker-remote1 ~]# docker restart tomcat2
tomcat2
[root@docker-remote1 ~]# docker exec -it tomcat2 /bin/bash
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:262: starting container process caused “process_linux.go:73: starting setns process caused \”fork/exec /proc/self/exe: no such file or directory\””

神奇的问题,restart 容器就进不去
stop 容器id
start 容器id

这样操作才可以进入容器。。。

dockerfile构建镜像知识点

# 创建个文件夹,存放dockerfile
[root@localhost ~]# mkdir docker
[root@localhost ~]# cd docker/

# 创建dockerfile(必须是这个文件名,否则提示找不到文件,要么用docker build -f指定)
[root@localhost docker]# cat dockerfile

# docker file用于基于一个镜像构建一个新镜像
# 基础镜像 IMAGE ID
FROM 82a5b82cec98

# 维护者
MAINTAINER venus

# 镜像操作 RUN用来在构建镜像时运行系统命令
RUN yum install -y httpd

# 设置JAVA环境变量
ENV JAVA_HOME /usr/local/jdk
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 映射端口,实际起到提示作用,docker run时仍旧需要指定映射端口
EXPOSE 80

RUN mkdir /root/ops
ADD ./start_httpd.sh /root/ops
# 如果ADD一个压缩文件,ADD会自动解压,不需要手动再解,另外仅支持当前路径下的文件,不支持绝对路径
RUN chmod 777 /root/ops/start_httpd.sh

# 启动容器时会运行的指令
CMD sh /root/ops/start_httpd.sh && /bin/bash

根据dockerfile构建一个镜像(centos6httpd)
docker build -t centos6httpd .

一定不要落下后面的英文的  点   .

使用daocloud为docker pull加速

从docker官方下载镜像速度那叫一个慢。解决这个问题可以用daocloud提供的镜像服务。

首先去https://www.daocloud.io注册个账号,登陆后,找到”加速器”,网页顶部有个火箭图标…


执行它给出的命令会自动配置。but,在centos7下yum装的docker-1.12.6经过这个脚本配置是无法启动的。
报错信息:

[root@localhost ~]# systemctl status docker.service -l
● docker.service - Docker Application Container Engine
 Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since Tue 2017-08-29 11:01:59 CST; 2min 48s ago
 Docs: http://docs.docker.com
 Process: 4145 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 4145 (code=exited, status=1/FAILURE)

Aug 29 11:01:59 localhost systemd[1]: Starting Docker Application Container Engine...
Aug 29 11:01:59 localhost dockerd-current[4145]: time="2017-08-29T11:01:59+08:00" level=fatal msg="unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '}' looking for beginning of object key string\n"
Aug 29 11:01:59 localhost systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Aug 29 11:01:59 localhost systemd[1]: Failed to start Docker Application Container Engine.
Aug 29 11:01:59 localhost systemd[1]: Unit docker.service entered failed state.
Aug 29 11:01:59 localhost systemd[1]: docker.service failed.

在http://pagespeed.v2ex.com/t/326229找到答案。

需要手动去改 /etc/sysconfig/docker 而不是脚本中改的 /etc/docker/daemon.json
复制下daemon.json中给出的http开头的地址,然后清理掉脚本配置的daemon.json文件,只留一行{}。

[root@localhost ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://bde0df14.m.daocloud.io"],}

然后去修改/etc/sysconfig/docker

[root@localhost ~]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --registry-mirror=http://bde0df14.m.daocloud.io'
添加--registry-mirror=http://bde0df14.m.daocloud.io

重启docker服务
再docker pull 速度就很快了。

docker 进入一个容器

通过 docker exec 参数进入一个容器,容器可以用容器id或者容器的名称进入

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f52423aa6b32 a8493f5f50ff "/bin/bash" 4 seconds ago Up 3 seconds test

比如 容器id方式
docker run -it f52423aa6b32 /bin/bash
或者 容器名方式
docker run -it test /bin/bash

一个进入容器小脚本:

#!/bin/bash
names=$1
if [[ ! -n $names ]]; then
 echo "docker container id or names not null"
 exit
fi
docker exec -it $names /bin/bash

保存到/usr/bin/dexec , 给予执行权限

用法:
dexec test
dexec f52423aa6b32

docker 容器保持后台运行的两种方式

环境:centos7.2,镜像centos7

方法1,run一个容器:

[root@localhost ~]# docker run -dit --hostname centos --name centos --restart always a8493f5f50ff /bin/bash

-dit 是后台运行、交互模式、分配终端,容器启动后不会退出
 如果没有it参数,run 一个容器以后,docker ps -a 容器状态就exited了
--restart always 容器可以随docker服务启动而启动

方法2: run 一个容器,并一直发送ping包

[root@localhost ~]# docker run -d --name test --hostname test a8493f5f50ff ping 127.0.0.1

这样容器就一直在发送ping包,不会退出。
意思就是然容器一直运行一个程序,不退出,容器就不会停止

推荐第一种