docker安装及高级应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker安装及高级应用相关的知识,希望对你有一定的参考价值。

一:docker基础讲解

1、环境搭建

网络YUM源

/var/lib/dockerdocker目录

/var/lib/docker/containers容器目录

yum -y install docker

service docker startchkconfig 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]"#作者,联系方式

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

 


本文出自 “13262050” 博客,请务必保留此出处http://13272050.blog.51cto.com/13262050/1962621

以上是关于docker安装及高级应用的主要内容,如果未能解决你的问题,请参考以下文章

docker概述及安装

docker概述及安装

docker概述及安装

系统学习docker---第二节docker架构,原理,安装及简单应用

系统学习docker---第二节docker架构,原理,安装及简单应用

Docker教程-1-学习及安装Docker