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不能被代理
系统版本: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服务。
需求:容器中需要跑一个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 会去执行这个,其实它就是个脚本
这样就实现容器里随容器启动而运行服务了。
安装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 ~]#