docker run 常用参数介绍

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  -d, --detach=false         指定容器运行于前台还是后台,默认为false
  -i, --interactive=false    打开STDIN,用于控制台交互
  -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false
  -u, --user=""              指定容器的用户
  -a, --attach=[]            登录容器(必须是以docker run -d启动的容器)
  -w, --workdir=""           指定容器的工作目录
  -c, --cpu-shares=0         设置容器CPU权重,在CPU共享场景使用
  -e, --env=[]               指定环境变量,容器中可以使用该环境变量
  -m, --memory=""            指定容器的内存上限
  -P, --publish-all=false    指定容器暴露的端口
  -p, --publish=[]           指定容器暴露的端口
  -h, --hostname=""          指定容器的主机名
  -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录
  --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录
  --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
  --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
  --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
  --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
  --device=[]                添加主机设备给容器,相当于设备直通
  --dns=[]                   指定容器的dns服务器
  --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
  --entrypoint=""            覆盖image的入口点
  --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量
  --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口
  --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用
  --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
  --net="bridge"             容器网络设置:
                                bridge 使用docker daemon指定的网桥
                                host    //容器使用主机的网络
                                container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源
                                none 容器使用自己的网络(类似--net=bridge),但是不进行配置
  --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities
  --restart="no"             指定容器停止后的重启策略:
                                no:容器退出时不重启
                                on-failure:容器故障退出(返回值非零)时重启
                                always:容器退出时总是重启
  --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
  --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

搭建docker私有仓库

系统版本:CentOS Linux release 7.2.1511 (Core)

目的:基于docker创建一个registry容器,做为docker仓库给其它机器拉取镜像用

安装iptables 如果有iptables,就略过

[root@localhost ~]# yum install -y iptables iptables-utils iptables-services
[root@localhost ~]# systemctl start iptables
[root@localhost ~]# systemctl enable iptables

# 安装docker

[root@localhost ~]# yum install -y docker

# 启动

[root@localhost ~]# systemctl start docker

# 开机启动docker服务

[root@localhost ~]# systemctl enable docker

# 查询docker 私库镜像环境名称 找官方的

[root@localhost ~]# docker search registry
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/registry The Docker Registry 2.0 implementation for... 1426 [OK]

# 拉取私库镜像

[root@localhost ~]# docker pull docker.io/registry

# 查看本地镜像

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 136c8b16df20 6 days ago 33.17 MB

# 根据本地registry镜像启动一个容器,指定容器名,主机名,挂载卷

[root@localhost ~]# docker run -d --name=docker-repo -h docker-repo -p 5000:5000 -v /home/docker_repo:/var/lib/registry 136c8b16df20

registry私库默认监听在5000端口上

# 为了测试方便,从官方拉取一个 busybox 镜像(体积小)

[root@localhost ~]# docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
7520415ce762: Pull complete
Digest: sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f

# 查看busybox镜像

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 136c8b16df20 7 days ago 33.17 MB
docker.io/busybox latest 00f017a8c2a6 5 weeks ago 1.11 MB

# 通过docker tag将 docker.io/busybox 镜像打一个标签,该镜像标志为要推送到私有仓库

[root@localhost ~]# docker tag docker.io/busybox 192.168.1.50:5000/busybox

# 注意命名 仓库地址+镜像名

[root@VM_33_244_centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 136c8b16df20 7 days ago 33.17 MB
192.168.1.50:5000/busybox latest 00f017a8c2a6 5 weeks ago 1.11 MB
docker.io/busybox latest 00f017a8c2a6 5 weeks ago 1.11 MB

#然后把 docker.io/busybox push到私有仓库中

[root@localhost ~]# docker push 192.168.1.50:5000/busybox
The push refers to a repository [192.168.1.50:5000/busybox]
c0de73ac9968: Mounted from busybox_small
latest: digest: sha256:68effe31a4ae8312e47f54bec52d1fc925908009ce7e6f734e1b54a4169081c5 size: 527

浏览器访问:
http://192.168.1.50:5000/v2/_catalog

# 删除本地busybox镜像

[root@localhost ~]# docker rmi -f 00f017a8c2a6

# 从私有仓库拉取

[root@localhost ~]# docker pull 192.168.1.50:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.1.50:5000/busybox ...
latest: Pulling from 192.168.1.50:5000/busybox
04176c8b224a: Pull complete
Digest: sha256:68effe31a4ae8312e47f54bec52d1fc925908009ce7e6f734e1b54a4169081c5
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 136c8b16df20 7 days ago 33.17 MB
192.168.1.50:5000/busybox latest 00f017a8c2a6 5 weeks ago 1.11 MB

# 注意事项
需要添加私有仓库信任 否则会报一个 http: server gave HTTP response to HTTPS client 错误
把 /etc/sysconfig/docker

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
改为:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=192.168.1.50:5000'

重启docker生效

registry 私库默认用/bin/sh登陆
镜像默认保存在 /var/lib/registry/docker/registry/v2/repositories 中

直接删除 上面目录下的文件夹,就可以删除镜像。

docker的端口映射是通过iptables实现,如果重启iptables,容器端口映射失效,需要重启docker服务。

docker启动容器时启动容器中的服务

需求:容器中需要跑一个tomcat服务,要实现容器启动时随容器启动tomcat

实现方法:

1、自定义一个镜像,因为官方centos镜像默认/etc/rc.d/rc.local没有执行权限(centos7)

docker run -dit --volume /home/dockermount:/mnt centos /bin/bash

/home/dockermount 这个目录用于主机和容器之间复制数据
启动一个容器,配置好jdk和tomat,过程略过
chmod 777 /etc/rc.d/rc.local  添加权限

编辑 /etc/rc.local 添加jdk环境变量,添加tomcat启动脚本

JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH

/usr/local/tomcat/bin/startup.sh

/bin/bash

保存退出
提交到本地镜像

docker ps 查看刚才的容器id

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f31da645ef98 centos:latest "/bin/bash" 6 minutes ago Up 6 minutes dev1

 容器id 镜像别名
[root@localhost ~]# docker commit f31da645ef98 centos-tomcat

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos-tomcat latest bc6be3dd8ff8 17 seconds ago 620.2 MB

[root@localhost ~]# docker run -dit --hostname dev --name dev --publish 10003:8080 --volume /home/dockermount:/mnt --restart always centos-tomcat /etc/rc.local

注意后面是 /etc/rc.local 会去执行这个,其实它就是个脚本
这样就实现容器里随容器启动而运行服务了。

centos6.5安装docker

安装docker,添加epel源:
[root@varnish ~]# wget -c http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@varnish ~]# rpm -ivh epel-release-6-8.noarch.rpm
导入公钥:
[root@varnish ~]# rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
安装docker:
[root@varnish ~]# yum install -y docker-io
[root@varnish ~]# service docker start
[root@varnish ~]# chkconfig docker on

查看docker信息:

[root@varnish ~]# docker info
Containers: 2
Images: 33
Storage Driver: devicemapper
 Pool Name: docker-252:1-918311-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 1748.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 2.5 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 2.6.32-431.el6.x86_64

从docker网站下载ubuntu镜像
[root@varnish ~]# docker pull ubuntu

用ubuntu输出hello world
[root@varnish ~]# docker run ubuntu /bin/echo hello world

列出已有的镜像:

[root@varnish ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04.1 c4ff7513909d 3 weeks ago 213 MB
ubuntu latest c4ff7513909d 3 weeks ago 213 MB
ubuntu 14.04 c4ff7513909d 3 weeks ago 213 MB
ubuntu trusty c4ff7513909d 3 weeks ago 213 MB
ubuntu utopic 75204fdb260b 3 weeks ago 226.4 MB
ubuntu 14.10 75204fdb260b 3 weeks ago 226.4 MB

当镜像下载成功后,可以看到12位的hash值像c4ff7513909d,这是下载完整的镜像的精简ID。
这些短的镜像ID是完整镜像ID的前12个字符,可以使用docker inspect 或者 docker images -notrunc=true来获得完整的镜像ID

进入ubuntu命令行:
[root@varnish ~]# docker run -i -t ubuntu /bin/bash

安装apache:

root@70cc135faece:/# sudo apt-get install apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package apache2
提示找不到apache2这个包。
root@70cc135faece:/# sudo apt-get update //先更新软件包库
root@70cc135faece:/# sudo apt-get install apache2
root@70cc135faece:/# service apache2 start
root@70cc135faece:/# netstat -an | grep 80
tcp6 0 0 :::80 :::* LISTEN

执行exit退出容器,再执行 docker run -i -t ubuntu /bin/bash 发现apache没了。包括IP信息都变了。
这是因为刚才是根据ubuntu镜像启动了一个新的容器,退出时,也就关闭了。要继续使用的话,需要将其提交到仓库中。

查看之前启动的容器ID:

[root@varnish ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c230803e75f 140630ae71cc /bin/bash 30 minutes ago Exited (130) 5 seconds ago ecstatic_bardeen
c06c6365282d ubuntu:14.04 /bin/bash 32 minutes ago Exited (127) 32 minutes ago drunk_poincare
d4ea5b21512f ubuntu:14.04 /bin/bash 44 minutes ago Exited (0) 33 minutes ago happy_feynman
542b4a79ab7b ubuntu:14.04 /bin/bash 48 minutes ago Exited (130) 46 minutes ago

根据提示,5秒之前退出的应该是我之前安装过apache的容器。
将其提交到仓库中:

[root@varnish ~]# docker commit d4ea5b21512f apache //CONTAINER ID + 别名 用于描述容器作用
f8e04197e16217a6580c31b4cc23198fde93d299fc9c8a2b4f0318625f276721 //返回一个唯一字符串,可以自定义名字。
下次启动:
[root@varnish ~]# docker run -t -i f8e04197e16217a6580c31b4cc23198fde93d299fc9c8a2b4f0318625f276721 /bin/bash //或者用别名

暂时记录到这里,回头继续。

删除单个镜像:

[root@varnish ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04.1 c4ff7513909d 3 weeks ago 213 MB
ubuntu 14.04 c4ff7513909d 3 weeks ago 213 MB
ubuntu trusty c4ff7513909d 3 weeks ago 213 MB
ubuntu 14.10 75204fdb260b 3 weeks ago 226.4 MB
[root@varnish ~]# docker rmi c4ff7513909d //IMAGE ID
Untagged: ubuntu:14.04
Untagged: ubuntu:14.04.1
Untagged: ubuntu:trusty
Deleted: c4ff7513909dedf4ddf3a450aea68cd817c42e698ebccf54755973576525c416
Deleted: cc58e55aa5a53b572f3b9009eb07e50989553b95a1545a27dcec830939892dba
Deleted: 0ea0d582fd9027540c1f50c7f0149b237ed483d2b95ac8d107f9db5a912b4240
Deleted: d92c3c92fa73ba974eb409217bb86d8317b0727f42b73ef5a05153b729aaf96b
Deleted: 9942dd43ff211ba917d03637006a83934e847c003bef900e4808be8021dca7bd
Deleted: 1c9383292a8ff4c4196ff4ffa36e5ff24cb217606a8d1f471f4ad27c4690e290

删除所有镜像:

[root@varnish ~]# docker rmi $(docker images | awk '{print$3}' | grep -v "IMAGE")

删除单个容器:

[root@varnish ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9408857e0cee centos:centos6 /bin/bash 3 seconds ago Up 2 seconds condescending_tesla
8d5a7b7a509c centos:centos6 /bin/bash About a minute ago Up About a minute focused_franklin
7a160e291b0c apache/centos6:latest /bin/bash 8 minutes ago Up 8 minutes loving_sammet

首选需要停止容器运行
[root@varnish ~]# docker stop 9408857e0cee //停止容器
9408857e0cee
[root@varnish ~]# docker rm 9408857e0cee //rm删除
9408857e0cee

[root@varnish ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d5a7b7a509c centos:centos6 /bin/bash 2 minutes ago Up 2 minutes focused_franklin
7a160e291b0c apache/centos6:latest /bin/bash 9 minutes ago Up 9 minutes loving_sammet

删除所有容器:

[root@varnish ~]# docker stop $(docker ps -a | awk '{print$1}' | grep -v "CONTAINER" )
8d5a7b7a509c
7a160e291b0c
[root@varnish ~]# docker rm $(docker ps -a | awk '{print$1}' | grep -v "CONTAINER" )
8d5a7b7a509c
7a160e291b0c
[root@varnish ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@varnish ~]#