Docker日常使用及问题

docker安装

# Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum, which CentOS 7 runs.
# Centos 6安装docker 链接:“www.centoscn.com/image-text/install/2014/1128/4202.html”
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum install docker-engine
service docker start

docker使用

# 搜索查看可以使用的镜像
docker search centos
# 拉取需要的镜像
docker pull centos:latest
# 查看本地镜像列表
docker images
# 查看网络状态
docker network ls
# 查看容器信息
docker inspect webhack

# 拷贝一个现存容器中的文件到本地
docker cp aaa39fe1e7af:/etc/redis.conf ./
# 查看一个容器的运行日志
docker logs -f 容器名orID
# 查看一个容器的root密码, 因为Docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到redmine容器的root用户的密码了。(没测试成功)
docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1

# 批量删除构建失败的容器
# 先停止容器运行再删除,否则会挂掉...
docker ps -a  | awk '{print $1}' | xargs docker stop
docker ps -a  | awk '{print $1}' | xargs docker rm
# 然后删除无用的镜像文件
docker rmi image_id

# 存出构建好的镜像文件
docker save -o honey.tar honey:v1
# 载入现有镜像到docker
docker load --input honey.tar
docker < honey.tar.gz
# 导出容器
docker export id > honey.tar
# 导入容器
cat honey.tar | docker import - honey:latest

# 启动一个容器的bash终端
docker run -a stdin -a stdout -t centos:6.6 /bin/bash
# 基于centos7的容器没有/bin/bash命令。。。。很乱

# 基于Dockerfile构建一个镜像文件
docker build -t honey:v1 .

# 挂载本地文件或目录到容器中,容器中对文件的修改和宿主机中对文件的修改都会同步到容器和宿主机中,最好的方式是挂载映射目录,因为编辑文件时可能会造成文件 inode 的改变,从 Docker 1.1 .0起,这会导致报错误信息。
# 参见:https://yeasy.gitbooks.io/docker_practice/content/data_management/volume.html
# 挂载文件时,可能会出现本地文件权限是root或者是权限比较大的文件目录,而挂载到容器中后,容器中的低权限或其他用户将无法对文件目录进行修改,解决方法是将本地的文件目录设置为777权限
docker run --net=host -v /home/docker/snmp/conf/supervisord.conf:/etc/supervisord.conf -v /home/docker/snmp/log:/home/log -it snmp:v3 supervisord

# 把容器放到后台运行并打印出容器的id
docker run -d

# 退出容器后即删除容器,不能与-d共用
docker run --rm -it 容器ID

# 提交修改后的容器为新的镜像
docker commit 容器ID 镜像ID

# Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro

docker export 和 docker save的区别

# export用于持久化容器(不是镜像),会丢失历史和元数据,无法回滚到以前的层
docker ps -a
docker export 容器ID > export.tar
# 导入
cat export.tar | docker import - export:v1

# save用于持久化镜像(不是容器),有历史所有的操作,可以会滚
docker save 镜像ID > image.tar
# 导入
docker load < image.tar

Dockerfile使用过程中的一些问题

# WORKDIR  指构建容器时容器内部的目录
WORKDIR /home
# COPY  复制本地文件到服务器的目录,无法复制操作容器内的文件
COPY soft/jdk-7u79-linux-x64.rpm /home
# RUN   运行服务器中的命令
RUN rpm -ivh jdk-7u79-linux-x64.rpm
# 切换目录
WORKDIR redis-3.2.0
WORKDIR src/
# 此时的目录为/home/redis-3.2.0/src
RUN pwd
# 容器内部的复制命令,无法操作本地文件
RUN cp redis-cli /usr/bin
# 默认调用的是sh -c apt-get install 某些情况下易出现问题
CMD apt-get install
# 所见即所得,按照自己想要的方式执行 调用exec from
CMD ["apt-get install"]

# 指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户执行命令
# 虽然使用nobody权限的用户启动容器执行命令比较安全,但是对于yum这种则无法执行
# 解决方法是使用supervisord启动执行的程序的时候指定启动的用户权限组进行执行启动
USER nobody

# 创建一个可以从本地或者其他容器挂载的挂载点,如果服务器不存在就自动创建
# 和-v创建卷的区别https://segmentfault.com/q/1010000004107293
VOLUME ["/data"]

CMD RUN的区别

CMD 容器启动时执行的命令,可被docker run中的命令重写覆盖,每个Dockerfile仅最后一条CMD指令生效
RUN 容器构建时运行的命令
ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被docker run中的命令重写覆盖,需谨记

# ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!
# ENTRYPOINT/CMD,一般两者可以配合使用,比如:
ENTRYPOINT ["/usr/sbin/sshd"]
CMD ["-D"]

# 在Docker daemon模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。
# 以下无效方式:
ENTRYPOINT service tomcat7 start #运行几秒钟之后,容器就会退出
 CMD service tomcat7 start #运行几秒钟之后,容器就会退出

# 这样有效:
ENTRYPOINT service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
# 或者
CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out

# 这样也有效:
ENTRYPOINT ["/usr/sbin/sshd"]
 CMD ["-D"]

错误解决

# 报错“tar (child): Error is not recoverable: exiting now”这类错误的时候
# 注意检查是否指定了WORKDIR

Docker相关资源

常用docker命令,及一些坑:http://blog.csdn.net/wsscy2004/article/details/25878363
Docker使用Dockerfile构建镜像 :http://my.oschina.net/u/1861837/blog/649015
Docker学习总结之Run命令介绍:http://www.cnblogs.com/vikings-blog/p/4238062.html
Docker学习笔记之二,基于Dockerfile搭建JAVA Tomcat运行环境:http://www.blogjava.net/yongboy/archive/2013/12/16/407643.html
Dockerfile reference:https://docs.docker.com/engine/reference/builder/
Docker — 从入门到实践(非常不错):https://yeasy.gitbooks.io/docker_practice/content/

后期更新问题

后期持续性的更新确实是个头疼的问题,不知道有没有类似github pages那种同步的功能会不会出现...

转载于:https://my.oschina.net/u/1188877/blog/822437

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值