用户:
创建docker用户并将其纳入docker这个用户组
group add docker
usermod -a -G docker $USER
安装:
yum install docker
pip install -U docker-compose
docker-compose -v
#wget -qO-https://get.docker.com/ | sh //获取最新版本
安装python模块docker
yum install docker-python -y
配置docker运行端口
修改/usr/lib/systemd/system/docker.service
在ExecStart=/usr/bin/docker daemon后边加上
-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock # --bip=172.11.0.1/24
systemctl daemon-reload
验证安装是否成功
#docker run hello-world
Docker服务启动|重启|停止
#service docker start //启动
#service docker restart //重启
#service docker stop //停止
Docker服务对应的版本查看
#docker version
Docker环境查看
#docker info
Docker命令帮助
#docker //查看docker的所有命令
#docker command --help //查看单个docker命令的帮助,如docker run --help
启动一次性运行的容器
#sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
# Start a very useful long-running process
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")
# Collect the output of the job so far
$ docker logs $JOB
# Kill the job
$ docker kill $JOB
启动交互模式容器
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
#sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1;done"
-d:以后台Daemon方式运行,执行成功后会返回一个该容器的ID
运行env命令来查看列表容器的环境变量。
$ sudodocker run --rm --name web2 --link db:db training/webapp env
以映射端口方式启动一个Web容器
# sudo docker run -d -P training/webapp python app.py
-d:以后台Daemon方式运行,执行成功后会返回一个该容器的ID
-P:端口映射,外部端口到容器端口的映射规则由docker负责
docker run -d -P training/webapp python app.py
-p:自己指定端口映射规则,格式为:-p 外部端口:容器端口
#sudo docker run -d -p 5000:5000 training/webapp pythonapp.py
此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口。例如:
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
使用--name标识来命名容器
sudodocker run -d -P --name web training/webapp python app.py
这将使我们的web容器和db容器连接起来。--link的形式
docker run -d -P --name web --link db:db training/webapp python app.py
--link name:alias
name是我们连接容器的名字,alias是link的别名。让我们看如何使用alias。
通过docker ps -l,可以查看到其PORTS列的端口映射规则
-l。这样组合的 docker ps 命令会返回最后启动容器的详细信息。
$ sudo docker ps //查看有那些正在运行着的容器 .最近的一个容器,有可能没有运行
-a:查看所有的容器,包含运行和没有运行的容器
如果你想通过很快捷的方式查看容器的端口
#sudo docker port 容器ID或容器名称
使用 docker port 可以查看指定 (ID或者名字的)容器的某个确定端口映射到宿主机的端口号。
$ sudodocker port nostalgic_morse 5000
以JSON的格式返回容器的具体信息
#sudo docker inspect 容器ID或容器名称
进入容器执行命令
#sudo docker exec -it 容器ID /bin/bash
查看容器的日志
$sudo docker logs 容器ID或容器名称
-f:以滚动的形式查看日志,类似于linux的tail -f XXX.log
docker logs -f nostalgic_morse
这次我们添加了一个 -f 标识。 docker log 命令就像使用 tail -f 一样来输出容器内部的标准输出。
退出当前容器
$sudo exit //在容器内部执行该命令(或crtl+D),一般在交互模式下退出当前容器
创建容器
# sudo docker create --name ubuntContainer ubuntu:14.04 /bin/echo 'Hello world'
重启容器
#sudo docker restart 容器ID
暂停容器
#sudo docker pause 容器ID //暂停
#sudo docker unpause 容器ID //解除暂停
停止容器
$sudo docker stop 容器ID或容器名称
#docker stop $(docker ps -q -a) //一次性停止所有容器,慎用
杀死容器
$sudo docker kill 容器ID或容器名称
删除容器
$sudo docker rm 容器ID或容器名称 //删除容器,正在运行的容器不能删除
#sudo docker rm $(docker ps -q -a) //一次性删除所有容器,慎用
创建mysql_server镜像,并生成一个容器
#cd /
#mkdir mysql_server
#vi Dockerfile
FROM centos:centos6
MAINTAINER ningyougang "xxxx@qq.com"
RUN yum install -y mysql-server mysql
RUN /etc/init.d/mysqld start &&\
mysql -e"grant all privileges on *.* to 'root'@'%' identified by'mysql';"&&\
mysql -e"grant all privileges on *.* to 'root'@'localhost' identified by'mysql';"&&\
mysql -u root-pmysql -e "show databases;"
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
# sudo docker build -t ningyougang/mysql_server . //生成镜像
#sudo docker run --name=mysql_server -d -Pningyougang/mysql_server //生成mysql_server容器
创建mysql_client镜像,并生成一个link到mysql_server的client容器
#cd /
#mkdir mysql_client
#vi Dockerfile
FROM centos:centos6
MAINTAINER ningyougang "xxxx@qq.com"
RUN yum install -y mysql
#sudo docker build -t ningyougang/mysql_client . //生成镜像
#sudo docker run --name=mysql_client1 --link=mysql_server:db -t -i ningyougang/mysql_client/usr/bin/mysql -h db -u root -pmysq //生成mysql_client容器
参数解释
--link:<name or id>:alias
通过上面的命令,link中的别名(alias)db即是mysql_client连接mysql_server的连接串
进入mysql_client研究其link的实现细节
#sudo docker exec-it bfc6cb037165 /bin/bash //以交互模式进入mysql_client容器内部
[root@bfc6cb037165/]# env | grep DB //查看与DB(也就是alias)相关的环境变量
DB_NAME=/mysql_client2/db
DB_PORT=tcp://172.17.0.25:3306
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_PORT_3306_TCP_ADDR=172.17.0.25
DB_PORT_3306_TCP=tcp://172.17.0.25:3306
[root@bfc6cb037165 /]#vi /etc/hosts
172.17.0.27 bfc6cb037165 #docker生成的mysql_client的IP、域名
172.17.0.25 db #docker生成的mysql_server的IP、域名
总结:可以发现docker在mysql_client内通过生成别名的环境变量和profile相关的主机和域名的配置,打通了客户端到服务器端的tcp连接通道,而对于上层的应用,不需要关注IP、端口这些细节,只需要通过别名来访问即可
把物理机的目录挂载到容器里
以交互模式启动一个容器,将物理机的/src/webapp挂载到/opt/webapp下
#sudodocker run -t -i -v /src/webapp:/opt/webapp ubuntu:14.04 /bin/bash
-v标识还可以将宿主机的一个特定文件挂载为数据卷
-v 物理机目录:容器目录:读写权限
其中默认的权限为可读写, ro:只读
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
使用-v标识来给容器内添加一个数据卷,你也可以在一次docker run命令中多次使用-v标识挂载多个数据卷。现在我们在web容器应用中创建单个数据卷。
$ sudodocker run -d -P --name web -v /webapp training/webapp python app.py
把物理机的文件挂载到容器里
#sudo docker run -t -i -v/src/webapp/test.html:/opt/webapp/test.html ubuntu:14.04 /bin/bash
Ø 把容器挂载到另外一个容器
#sudo docker create -v /dbdata --name dbdata ubuntu:14.04 //创建容器
#sudodocker run -it --volumes-from dbdata ubuntu:12.04 /bin/bash //启动容器卷来自dbdata
-volumn-from:卷来自哪个容器
在另外一个容器使用--volumes-from标识,通过刚刚创建的数据卷容器来挂载对应的数据卷
$ sudodocker run -d --volumes-from dbdata --name db1 training/postgres
可以将对应的数据卷挂载到更多的容器中:
$ sudodocker run -d --volumes-from dbdata --name db2 training/postgres
您也可以对一个容器使用多个--volumes-from标识,来将多个数据卷桥接到这个容器中。
数据卷容器是可以进行链式扩展的,之前的dbdata数据卷依次挂载到了dbdata 、db1和db2容器,我们还可以使用这样的方式来将数据卷挂载到新的容器db3:
$ sudodocker run -d --name db3 --volumes-from db1 training/postgres
把容器挂载作为数据备份
#sudo docker run --volumes-from dbdata -v $(pwd):/backup--name worker ubuntu tar cvf /backup/backup.tar /dbdata
首先利用ubuntu镜像创建一个容器worker.使用—volumes-from dbdata参数来让容器挂载dbdata容器的数据卷;使用 –v $(pwd):/backup参数来挂载本机的当前目录到worker容器的/backup目录
Woker容器启动后,执行tar命令将/dbdata压缩到/backup/backup.tar,这样就到物理机的当前目录了
把容器挂载作为数据迁移
#sudo docker run -v/dbdata --name dbdata2 ubuntu /bin/bash
后在新的容器中的数据卷里un-tar此备份文件。
#sudo docker run--volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/.tar
即使你删除所有de 挂载了数据卷dbdata的容器(包括最初的dbdata容器和后续的db1和db2),数据卷本身也不会被删除。要删在磁盘上删除这个数据卷,只能针对最后一个挂载了数据卷的容器显式地调用docker rm -v命令。这种方式可使你在容器之间方便的更新和迁移数据。
使用--volumes-from参数来创建一个挂载数据卷的容器,像这样:
$ sudodocker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
挂载到某个容器
#sudo docker attach 容器ID
使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了
显示运行容器的进程信息
#sudo docker top 容器ID
从容器内部拷贝文件到物理机
#sudo docker cp cd0f61fb8256:/opt/a.html /
列出容器里被改变的文件夹或文件
#sudo docker diff 容器ID
list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的
镜像查看
#sudo docker images //在本机进行镜像查看
内容定位标示符叫做 digest。只要用于生成镜像的镜像源不更改, digests 值就是可以预料的。使用 --digests 标识来列出镜像 digests 的值
$docker images --digests | head
#sudo docker inspect 镜像ID //查看单个镜像的具体信息,以JSON格式返回
过滤,例如,返回容器的 IP 地址,如下:
$ sudodocker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
使用docker inspect来返回容器名字。
$ sudodocker inspect -f "{{ .Name }}" aed84ee21bde
获取镜像
# sudo docker pull centos //从DockerHub获取镜像
查询镜像
#sudo docker search 镜像名称 //从DockerHub按照镜像名称模拟查询镜像
在运行的容器内使用 gem 来安装 json
root@0b2616b0e5a8:/# gem install json
在完成操作之后,输入 exit命令来退出这个容器。
制作镜像
ü 通过Dockerfile构建镜像
#sudo cd / //来到根“/”下
#sudo mkdir redis //创建redis文件夹
#touch Dockerfile //创建Dockerfile文件,文件内容见如下灰色部分
FROM ubuntu:14.04
RUN apt-get update && apt-getinstall -y redis-server
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]
#sudo docker build -t ningyougang/redis . //通过dockerbuild制作镜像
参数解释
-t:tag名称
.:当前Dockerfile的路径,在此处表示当前文件夹下
对运行着的容器commit镜像
# sudo docker commit -m "Added json gem" -a"Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2
参数解释
-m:提交注释,如此处你加了什么特别的功能
-a:作者
0b2616b0e5a8:运行着的容器ID
ouruser/sinatra:v2:给当前提交的镜像起名字并打标签
备注:从上面可以看出,我们可以通过docker commit来创建镜像,但是这种方式有点凌乱而且很难复制,更好的方式是通过Dockerfile来构建镜像,因为它步骤清晰并且容易复制
给镜像打标签
#sudo docker tag 5db5f8471261 ouruser/sinatra:devel //当commit or build后,对镜像打标签
5db5f8471261:此处的id为镜像ID
备注:向私有仓库push镜像也要打标签
推送镜像到公共库DockerHub
#sudo docker push ouruser/sinatra
下载私有仓库镜像
# docker pull registry #从DockerHub下载registry镜像,里面含私库的运行环境,#当然你也可以自己下载源码包,自己安装
推送之前打tag
# docker tag 704ca5ad68c5 192.168.202.213:5000/newtouch/activemq #打标签(必须先打标签,#在推送)
该命令格式为:docker tag $ID $IP:$port/$name。push到私库上必须先打个tag,而tag名称的格式为:$IP:$port/$name, 个人感觉此处设计不太好或我自己没有找到更好的办法。如果设计良好应该可以直接push,不用打标签.
Push tag到镜像
#docker push 192.168.202.213:5000/newtouch/activemq #将此tag推送到私有库
Push到仓库后,远程查看
#curl http://192.168.202.213:5000/v1/search #push之后,远程查看
在另外一个docker客户端,从私有仓库下载
#docker pull 192.168.202.213:5000/newtouch/activemq
Docker tag报https错误问题解决:
vi /etc/default/docker #红色部分是添加的部分,重启docker服务
# Docker Upstart and SysVinitconfiguration file
# Customize location of Dockerbinary (especially for development testing).
#DOCKER="/usr/local/bin/docker"
# Use DOCKER_OPTS to modify thedaemon startup options.
#DOCKER_OPTS="--dns8.8.8.8 --dns 8.8.4.4"
DOCKER_OPTS="--insecure-registry 192.168.202.213:5000"
# If you need Docker to use anHTTP proxy, it can also be specified here.
#exporthttp_proxy="http://127.0.0.1:3128/"
# This is also a handy place totweak where Docker's temporary files go.
#exportTMPDIR="/mnt/bigdrive/docker-tmp"
删除镜像
#sudo docker rmi 镜像ID
-f参数来强制删除一个存在容器依赖的镜像,因为这样往往会造成一些遗留问题
docker rmi -f ubuntu
列出镜像的变更历史
# docker history
实时打印所有容器的系统事件
#sudo docker events
将image导出到文件
docker save -o ubuntu_14.04.tar ubuntu:14.04 载入镜像
docker save –o tar文件
例如:
$docker save -o python_2.7.10.tardocker.mapplus.cn/python:2.7.10
导入image文件
docker load -i tar文件
例如:
$docker load -i python_2.7.10.tar
或
$ sudo docker load < ubuntu_14.04.tar