docker学习

来源:互联网 发布:mac 外接显示器 风扇 编辑:程序博客网 时间:2024/05/16 02:41

用户:

 创建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_clientIP、域名

172.17.0.25     db               #docker生成的mysql_serverIP、域名

 

总结:可以发现dockermysql_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容器和后续的db1db2),数据卷本身也不会被删除。要删在磁盘上删除这个数据卷,只能针对最后一个挂载了数据卷的容器显式地调用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 taghttps错误问题解决:

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 --input ubuntu_14.04.tar

$ sudo docker load < ubuntu_14.04.tar
这将导入镜像以及其相关的元数据信息(包括标签等)
可以使用docker load命令来导入镜像存储文件到本地的镜像库,又可以使用docker import命令来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

docker推荐:https://docs.docker.com/

docker-mysql  https://hub.docker.com/_/mysql/
docker-python http://docker-py.readthedocs.io/en/latest/api/?highlight=import_image
build-run https://docs.docker.com/engine/getstarted/step_four/
params-info http://docker-py.readthedocs.io/en/stable/port-bindings/
docker-cmd http://www.cnblogs.com/imoing/p/dockervolumes.html

0 0
原创粉丝点击