,
- docker search xxx
指定星级
- -s=0
,一般情况下会删除镜像的标签,而不是文件,当删除最后一个 TAG 时则会删除文件,需要注意。
- docker rmi xxx
删除可以强制删除镜像,推荐做法为先删除依赖该镜像的所有容器,之后删除镜像,
- -f
创建镜像: 创建镜像包括 3 种方式,基于已有镜像的容器创建,首先启动一个镜像
- Qdocker rm e81
,任意创建一个 test 文件,之后创建镜像
- docker run -ti ubuntu:14.04 /bin/bash
;基于本地模板创建,推荐使用 OpenVZ 提供的模板来创建;基于 Dockerfile 创建。
- docker commit -m "add file" -a "xionger" a9fdsfxx test
,导入镜像
- sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
上传镜像:
- docker load --input ubuntu_14.04.tar
,默认上传镜像到 DockerHub 官方仓库,需要登录。
- docker push NAME[:TAG]
, 通过
- docker create -it ubuntu:lastest
查看容器,通过
- docker ps -a
启动容器 新建并启动容器:
- docker start
,
- docker run ubuntu /bin/bash
参数守护态运行,通过 Ctrl+d 或者 exit 退出容器 终止容器:
- -d
,首先会发送 SIGTERM 信号,一段时候后发送 SIGKILL, 可以通过
- docker stop xxx
强行中止,
- docker kill
可以关闭并重启容器,
- docker restart
可以查看处于终止态的容器信息。 进入容器:
- docker ps -a -q
会被阻塞不推荐使用;
- docker attach xxx
可以直接在容器中运行命令;nsenter 工具。 删除容器:
- docker exec -ti xxx /bin/bash
,需要注意区分,
- docker rm xxx
是删除镜像,
- rmi
是删除容器 导入和导出容器:
- rm
导出一个已经创建的容器到文件,不管是否在运行;
- docker export xxx
,需要理解的是
- docker import
的是快照,信息少,而
- export
的是镜像,信息多,包含元数据和历史信息。
- save
来查看高星镜像。此外,Docker Hub 还可以通过设置追踪类似 GitHub 的网站,然后根据其更行,自动执行创建。 创建和使用私有仓库:可以通过官方提供的
- -s N
镜像来简单搭建一套本地私有仓库环境。
- registry
- docker run - d - p 5000 : 5000 - v / opt / data / registry: /tmp/registry registry docker images docker tag ubuntu: 14.04 139.196.96.27 : 5000 / test docker push 139.196.xx.xx: 5000 / test curl http: //139.196.xx.xx:5000/v1/search
- docker pull 139.196.xx.xx: 5000 / test
Tip:
CURL(CommandLine Uniform Resource Locator):curl 是利用 URL 语法在命令行方式下工作的开源文件传输工具。
安装 Docker(Ubuntu16.04),默认安装在
- /var/lib/docker
- sudo apt - get install apt - transport - https sudo apt - get update sudo apt - get install - y docker.io
Tip:
在用 putty 连接阿里云时,经常会断开,如何解决?
解决方法:在 Connection 里面有个 Seconds between keepaliaves。这里就是每间隔指定的秒数,就给服务器发送一个空的数据包,来保持连接。以免登录的主机那边在长时间没接到数据后,会自动断开 SSH 的连接,设置为 10。
阿里云购买 ECS, 操作系统版本 Ubuntu 16.04(LTS)
数据管理: 在使用 docker 过程中,会涉及查看容器内应用产生的数据,或者数据在多个容器间共享,此时需要管理数据的两种方式包括数据卷 Data Volumes 和数据卷容器 Data Volume Containers.
数据卷:是一个可供容器使用的特殊目录,绕过文件系统,具有的特性包括数据卷可以在容器之间共享和重用、对数据卷的修改会马上生效、对数据卷的更新不会影响镜像、卷会一致存在,知道没有容器使用,类似 Linux 下对目录或文件进行 mount 操作。
在容器内创建一个数据卷:使用
镜像创建一个 web 容器,并创建一个数据卷挂在到容器的 / webapp 目录,
- training/webapp
。 挂载一个主机目录作为数据卷:加载主机的
- docker run -d -P --name web -v /webapp python app.py
目录到容器的
- /src/webapp
目录,
- /opt/webapp
。 Tip: 编辑工具包括 vi 或者 sed --in-place,推荐挂载目录而不是文件,因为 inode 变化会造成 docker 容器启动失败。 数据卷容器:其实就是一个普通的容器,其中会挂载数据卷用户共享,创建数据库容器 dbdata,之后其他容器将挂载可以挂载该数据卷容器中的数据卷。
- docker run -d -P --name web - v /src/webapp:/opt/webapp training/webapp python app.py
- docker run - it - v / dbdata--name dbdata ubuntu ls docker run - it--volumes - from dbdata--name db1 ubuntu
利用数据卷容器迁移数据:可以通过数据卷容器对其中的数据卷进行备份、回复,以实现数据的迁移。接下来的示例利用 ubuntu 镜像创建一个容器 worker,使用
参数挂载 dbdata 容器的数据卷, 使用
- --volumes-from dbdata
参数来挂载本地的当前目录到 worker 容器的
- -v ${pwd}:/backup
目录, 容器启动后,使用
- /backup
来讲
- tar cvf /backup/backup.tar /dbdata
下内容备份为容器内的
- /dbdata
。
- /backup/backup.tar
- docker run--volumes - from dbdata - v $ {
- pwd
- }: /backup --name worker ubuntu tar cvf /backup / backup.tar / dbdata
- //恢复,首先创建一个带有数据卷的容器dbdata2,之后 创建另一个新的容器,挂载dbdata2容器,并使用untar解压备份文件到所挂载的容器卷中即可
- docker run - v / dbdata--name dbdata2 ubuntu / bin / bash docker run--volumes - from dbdata2 - v $ {
- pwd
- }: /backup busybox tar xvf /backup / backup.tar
在生产环境,推荐使用分布式文件系统 Ceph、GPFS、HDFS 定期对主机的本地数据进行备份。
网络基础配置:
端口映射实现访问容器:在启动容器时,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。可以使用
映射端口,
- -p ip:hostPort:containerPort
查看应用的信息,
- docker logs
查看端口配置。
- docker port
- docker run - d - p 5000 : 5000 - p 3000 : 80 training / webapp python app.py
容器互联实现容器间通信:容器见的连接系统是除了端口映射外另一种可以与容器中应用进行交互的方式,它会在源和接受容器间创建一个隧道,接受容器可以看到源容器制定的信息,比如
连接应用容器和数据库容器,这样可以保证 db 的接口不暴露到公网。
- --link
- docker run - d - P--name web training / webapp python app.py docker ps - l docker inspect - f xxx
- //容器互联
- docker run - d--name db training / postgres docker rm - f web docker run - d - P--name web--link db: db training / webapp python app.py docker ps
Docker 通过两种方式为容器公开连接信息,包括环境变量
和 / etc/hosts 文件,通过
- env
安装 ping。 扩展知识:Docker 已有的实现 PaaS 的项目有 Deis、Flynn 等,持续集成方面有 Drone,管理工具有 Citadel, Shipyard, DockerUI 等。
- apt-get install -yqq inetutils-ping
基本结构:dockerfile 由命令语句组成,支持 #开头的注释,分为 4 个部分,包括基础镜像信息、维护者信息、镜像操作指令和容器启动执行指令,在 docker hub 上有很多 dockerfile 的 demo,需要时可以直接使用。
- #基础镜像FROM ubuntu#维护者信息MAINTAINER xionger xiongere@email.com#镜像的操作指令RUN apt - get update && apt - get install - y nginx RUN echo "\ndaemon off;" >> /etc/nginx / nginx.conf#容器启动时执行指令CMD / usr / sbin / nginx
指令:一般格式为 INSTRUCTION arguments,具体如下所示。
FROM
默认的第一条指令 MAINTAINER
- <image>:<tag>
维护者信息 RUN
- <name>
或者 RUN
- <command>
,前者将在 shell 终端中运行命令,即
- ["executable", "param1", "param2"]
,后者则使用
- /bin/sh -c
执行。 CMD
- exec
使用
- ["executable", "param1", "param2"]
执行,推荐方式。 EXPOSE
- exec
告诉 Docker 服务器容器暴露的端口号,供互联网系统使用。 ENV
- <port> [<port>..]
指定一个环境变量,会被后续的
- <key> <value>
指令使用 ADD
- RUN
该命令将复制指定
- <src> <dest>
复制本地主机
- <src> <dest>
到容器中
- <src>
, 推荐使用 ENTRYPOINT
- <dest>
配置容器启动后执行的命令,不能被
- ["executable", "param1", "param2"]
提供的参数覆盖 VOLUME
- docker run
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据。 USER
- ["/data"]
指定运行容器时的 UID,后续的
- daemon
也会使用指定用户,如
- RUN
,要获取管理员权限时可以使用
- RUN group add -r postgres && useradd -r -g postgres postgres
而不是
- gosu
WORKDIR
- sudo
为后续的指令配置工作目录 ONBUILD
- path/to/workdir
配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。
- [INSTRUCTION]
创建镜像:编写好 dockerfile 后,可以通过
命令来创建镜像,该命令将读取指定路径下(包括子目录)的 dockerfile,并将该路径下所有内容发送给 docker 服务端,由服务端来创建镜像,此外可以通过
- docker build
文件来忽略目录或文件,还可以通过
- .dockerignore
指定镜像的标签信息。示例
- -t
- docker build -t build_repo/first_image /tmp/docker_builder/
操作系统: CentOS 和 Ubuntu 都可以,个人喜好 ubuntu(还可以选用 debian:jessie, alpine),属于最基础的镜像。
tip: 当试图安装软件出现没有相关包信息时,需要
或编辑
- apt-get update
文件(
- /etc/apt/sources.list
, 需要时在查询,比如 163 的镜像,阿里云的话无需设置), 可以通过
- deb, deb-src
查看当前网络情况。 支持 SSH:当需要直接进入容器进行管理时安装,不必须。 Web 服务器与应用 (Nginx, 可以使用淘宝优化的 Tengine 代替 Nginx,Tomcat):在
- netstat -tunlp
下创建
- /usr/docker
,
- tomcat
目录应用存放 Dockerfile 文件,最终还是选择通过 pull 拉去镜像的方式安装应用,dockerfile 比较复杂。
- nginx
- docker pull nginx docker ps - a
- //-p 80:80:将容器的80端口映射到主机的80端口
- //-name mynginx:将容器命名为mynginx
- //-v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
- //-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
- //-v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs
- docker run--name nginx01 - p 80 : 80 - v $PWD / www: /www -v $PWD/conf: /etc/nginx - v $PWD / logs: /wwwlogs -d nginx
- docker pull tomcat
- docker run --name tomcat01 -p 8080:8080 -v $PWD/test: /usr/local / tomcat / webapps / test - d tomcat
tip:
有时可能需要重启 docker 服务,
,可以选择 tomcat7.0:jdk1.8 nginx 配置详解 nginx 官方文档 数据库应用 MySQL, MongoDB, Redis
- service docker restart
- docker pull mysql docker run - p 3306 : 3306--name mysql01 - v $PWD / conf: /etc/mysql - v $PWD / logs: /logs -v $PWD/data: /mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql
- / / 主从模式docker run - p 3306 : 3306--name mysql01 - v $PWD / conf01: /etc/mysql - v $PWD / logs01: /logs -v $PWD/data01: /mysql_data -e MYSQL_ROOT_PASSWORD=123456 -e REPLICATION_MASTER=true -d mysql
- docker run -p 3307:3306 --name mysql02 -v $PWD/conf02: /etc/mysql - v $PWD / logs02: /logs -v $PWD/data02: /mysql_data -e MYSQL_ROOT_PASSWORD=123456 -e REPLICATION_SLAVE=true --link mysql01:mysql01 -d mysql
- / / mongodb,暂时单机,其默认提供集群的配置docker pull mongo docker run - p 27017 : 27017 - p 28017 : 28017--name mongodb01 - v $PWD / db01: /data/db - e MONGODN_PASS = "123456" - d mongo
- //redis
- docker pull redis docker run - p 6379 : 6379--name redis01 - v $PWD / data01: /data -d redis redis-server --appendonly yes/
tip: 可以进入 db 的容器进行操作,
其他应用:maven, gitlab, jenkins, dubbo, cat,具体内容将在之后的文章中陆续介绍。
- docker exec -ti mysql /bin/bash
- docker pull jenkins docker run--name jenkins01 - p 9090 : 8080 - p 9091 : 50000 - v $PWD / jenkins01: /var/jenkins_home - d jenkins
构建 Docker 容器集群:核心问题就是让不同主机中的 Docker 容器相互访问,简单的方式包括两种。使用自定义网桥连接跨主机容器,Docker 默认的网桥是 docker0,可以通过
查看。使用 Ambassador 容器:当 2 个 docker 容器再同意主机时,可以通过 --link 相互访问,如果需要跨主机实现,则需要知道其他物理主机的 IP 地址。 Docker CI 集成方案:在之后的 Jenkins 一文中将重点分析。
- brctl show
Tip:
目前百度 BAE 已经在生产环境使用 Docker,Airbnb,ebay 已使用 mesos 集成 docker 部署应用,此外可以使用 apparmor 对容器的能力进行限制。
个人目前实践计划
私有 Docker 仓库暂时不建立,先使用 DockerHub;Git 类似,先使用 Github;Maven 需要使用 Nexus 建立一个私有库;jenkins 之间搭建就好。
参考资料
来源: http://www.cnblogs.com/wanliwang01/p/docker01.html