一:docker基础讲解
1、环境搭建
网络YUM源
/var/lib/dockerdocker目录
/var/lib/docker/containers容器目录
yum -y install docker
service docker start;chkconfig docker on
2、基础命令
docker version基本信息查看
docker info 查看系统(docker)层面信息,包括管理的images, containers数等
docker searchxxx搜索镜像
docker pullxxxx下载镜像(chug/ubuntu12.10x64)
Docker push XXXX上传镜像
3、查看镜像
docker images: 列出images
docker images -a :列出所有的images(包含历史)
docker images --tree :显示镜像的所有层(layer)
docker rmi <image ID>: 删除一个或多个image
4、使用镜像创建容器
docker run --name wang chug/ubuntu12.10x64
--name容器命名(不用默认)
docker run --name daemon_dave -d httpd /bin/sh -c "while true;do echo hello world; sleep 1; done"
-d放入后台,循环打印hello world
交互式运行
docker run -i -t chug/ubuntu12.10x64 /bin/bash
5、再次启动容器
docker start/stop/restart <container> 开启/停止/重启container
docker start [container_id] :
docker attach [container_id] 进入运行容器实例(有时不行)
docker exec -it ID /bin/bash进入运行的docker后台
docker start -i <container> 启动一个container并进入交互模式(相当于先start,在attach)
6、端口映射
docker指令:docker run -p ip:hostPort:containerPort redis
使用-p参数会分配宿主机的端口映射到虚拟机。
IP表示主机的IP地址。
hostPort表示宿主机的端口。
containerPort表示虚拟机的端口。
7、删除容器
docker rmXXXXX
docker rm `docker ps -a -q` :删除所有的container
docker ps -a -q | xargs docker rm :同上, 删除所有的containe
8、生成新的镜像
方法一:
docker commit <container-id> <image-name>命令可以把一个正在运行的容器变成一个新的镜像。 用户名/容器名
docker commit -m="新创建镜像的提交信息" --author="创建的作者信息" ID 用户名/仓库名:webserver标签名
方法二:
mkdir /static_web && cd !$ && touch Dockerfile
cat Dockerfile
FROM centos#原镜像
MAINTAINER MR wang "[email protected]"#作者,联系方式
RUN mkdir /wang#运行的命令(shell形式)
RUN echo 1234 > /wang/ab.txt
RUN [ "mkdir","/xiang" ]#运行的命令(exec形式)
EXPOSE 80#开放的端口
CMD [ “/common” ]#执行的脚本
ENV name 2014-07-07#环境变量(可选)
docker build -t=‘wang/static_web:v1‘ .#构建镜像wang仓库名,sta...镜像名,v1标签名
docker build --no-cache -t=‘wang/static_web:v1‘ . --no-cache确保构建过程不使用缓存(相当于重新构建)
9、持久化容器与镜像(写入文件)
export命令用于持久化容器
docker export <CONTAINER ID> > /tmp/export.tar
持久化镜像
Save命令用于持久化镜像
docker save 镜像ID > /tmp/save.tar
10、恢复(导入)
cat /tmp/export.tar | docker import - export:latest容器
docker load < /tmp/save.tar镜像
11、镜像打标签
docker tag daa11948e23d load:tag
export-import与save-load的区别
导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag <LAYER ID> <IMAGE NAME>来回滚之前的层)。
二:拓展
1、上传文件到容器
# docker cp /home/vim_7.3.429-2ubuntu2_amd64.deb cae3b75b7ede:/home
2、查看容器信息
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID
docker ps -n x 显示最后x个容器
docker inspect wang查看更多容器信息
docker inspect --format=‘{{ .HostConfig.LogConfig.Type}}‘ wang
--format 以什么格式查找.key键
docker inspect --format ‘{{ .HostConfig.LogConfig.Type}}‘ wang
多个容器查询
docker inspect --format ‘{{ .HostConfig}}‘
‘{{ .HostConfig.LogConfig.Type}}‘wang xiang
3、查看容器进程后端日志
docker logs -ft daemon_dave-f(与tail -f一样)-t加时间daemon_dave容器标识符
docker logs --tail 10 daemon_dave最后10行
4、查看容器内进程
docker top daemon_dave
5、执行容器内命令(非交互)
docker exec daemon_dave ls /daemon_dave容器标识符
6、自动重启容器
docker run --restart=always --name daemon_dave -d httpd /bin/sh -c "while true;do echo hello world; sleep 1; done"always无论退出代码是啥都重启
docker run --restart=on-failure:2 --name daemon_dave -d httpd /bin/sh -c "while true;do echo hello world; sleep 1; done"只有退出代码非0,重启,最多2次
7、查看镜像构造过程
docker history bb896b831086
8、查看宿主机的映射端口
docker ps 80/tcp, 0.0.0.0:32768->88/tcp
docker port b5d07ee6af90 880.0.0.0:32768
docker port redis6379/tcp -> 0.0.0.0:32770
9、不能再docker内执行systemctl解决
docker run -d -p 80 -e "container=docker" --privileged=true -v /wang/xiao/:/var/www/html --name web wang/xiang /usr/sbin/init 启动
-v物理挂在到docker内
docker exec -it ID /bin/bash进入运行的docker后台
执行命令
三:项目实验
1、docker部署静态HTML网页
cat Dockerfile
FROM docker.io/wellsie/centos7#源镜像
MAINTAINER MR wang "[email protected]3.com"#作者,联系方式
ENV REFRESHED_AT 2017-07-05#定义一个时间(变量形式)
RUN yum -y install httpd#装包
RUN mkdir /var/www/html -p#建目录
RUN mkdir /etc/httpd/conf -p
ADD httpd.conf /etc/httpd/conf/#增加文件到docker
RUN systemctl enable httpd#启动服务
EXPOSE 80#docker服务接口启动80端口
docker build --no-cache -t=‘ssssssss/xxxxxxxx‘ .#建造镜像
docker run -d -p 80 --restart=always -e "container=docker" --privileged=true -v /wang/xiao/:/var/www/html --name web ssssssss/xxxxxxxx /usr/sbin/init
#启动服务(-v挂载本地到docker)
docker exec -it ID /bin/bash#进入容器
2、docker构建redis
Ubuntu确定源没问题
cat Dockerfile
FROM wan/ubuntu
MAINTAINER MR wang "[email protected]"
ENV REFRESHED_AT 2017-07-05
RUN apt-get update
RUN apt-get -y install redis-server redis-tools
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]开启服务
CMD []
docker build -t ubuntu/redis:v1 .
docker run -d -p 6379 --name redis ubuntu/redis:v1
docker port redis
./redis-cli -p portceshi
3、docker容器互联(共享多个)
docker run -i -t -d ubuntu/redis:v1不开放端口
docker run -d -p 1234 -e "container=docker" --link redis:db --privileged=true -v /wang/xiao/:/var/www/html --name webapppp ssssssss/xxxxxxxx /usr/sbin/init
链接redis,db别名
测试
[[email protected] cgi-bin]# vi pyth.py
#!/usr/bin/env python
#coding:utf-8
a=123
def application(environ, start_response):
start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
#return "type(start_response)"
a=RedisServer(host=‘172.17.0.2‘,port=6379)
print a.error
a.run()
print a.error
return "a %s" % a.error
from redis import Redis
class RedisServer(object):
def __init__(self,host,port):
self.redis=Redis(host=host,port=port)
self.error=‘false‘
def run(self):
self.redis.set(‘name‘,‘wa‘)
if self.redis.get(‘name‘):
self.error=True
@property
def response(self):
return self.error
4、网卡桥接,docker内静态IP
centos7宿主机上建立Docker桥接物理网络过程
创建桥接网卡
文件br0建立桥接
使其docker使用br0
修改文件,使其docker接口为br0
~#:vim /etc/sysconfig/docker
#在OPTIONS=‘--selinux-enabled‘这行中修改为OPTIONS=‘--selinux-enabled -b=br0‘即让docker服务启动时使用br0网卡进行桥接
启动docker
service docker start
启动一个手动设置网络的容器
这里最好不要让docker自动获取ip,下次启动会有变化而且自动获取的ip可能会和物理网段中的ip冲突
1 |
~#:docker run -itd --net=none --name=test centos7 /bin/bash |
下载pipework工具
git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
为容器配置静态IP
pipework br0 test 192.168.184.11/[email protected]
四:备份
1、导入与导出
导出(导出容器快照到本地文件)
docker ps -a
docker export 7691a814370e > ubuntu.tar
导入(从容器快照文件中再导入为镜像)
cat ubuntu.tar | docker import - test/ubuntu:v1.0