0.参考资料(感谢大家的分享):
https://docs.docker.com
https://yeasy.gitbooks.io/docker_practice/content
https://my.oschina.net/huangyong/blog/372491
1.定义
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
2.概念
镜像(Image)是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等配置参数,分层存储。比如 Docker 官方镜像 ubuntu:14.04
包含完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。
容器(Container)是镜像运行时的实体,类似就像是面向对象程序设计中的类和实例的关系。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository)用于存放镜像,命名规则:ubuntu:14.04
(软件名:版本)(不加版本视为最近版本)。多用户环境:jwilder/nginx-proxy
(用户名/软件名)。
3.安装
内核版本 >= 2.6.32-431
查看内核版本:uname -r
升级内核(这里根据自己的操作系统来找版本):
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum -y --enablerepo=elrepo-kernel install kernel-lt
修改内核配置:vi /etc/grub.conf
,将 default=1
修改为 default=0
,重启:reboot
安装 Docker (https://docs.docker.com/engine/installation/linux/centos/):
$ sudo yum update
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
$ sudo yum install docker-engine
$ sudo systemctl enable docker.service
$ sudo systemctl start docker
$ sudo docker run --rm hello-world
4.镜像
搜索镜像:docker search imageName
https://hub.docker.com/explore
获取镜像:docker pull [选项] [Docker Registry 地址]<仓库名>:<标签>
例子:$ docker pull ubuntu:14.04
运行镜像:$ docker run -it --name testname --rm ubuntu:14.04 bash
-it
:-i
:交互式操作,-t
:终端。进入bash
后,执行一些命令并查看返回结果。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除。ubuntu:14.04
:这是指用ubuntu:14.04
镜像为基础来启动容器。bash
:放在镜像名后的是命令,这里我们希望有个交互式Shell
,因此用的是bash
。
退出容器:exit
:退出,停止运行;Ctrl+ p q
:退出,不停止运行。
列出本地镜像:docker images
使用 Dockerfile
定制镜像:
创建一个名为 Dockerfile 的文件
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
FROM
:指定基础镜像;
RUN
:执行命令,RUN
COPY
:复制文件。格式:COPY <源路径> <目标路径>
ADD
:更高级的复制文件。如果 为一个 tar 压缩文件的话,压缩格式为 gzip , bzip2 以及 xz 的情况
下, ADD 指令将会自动解压缩这个压缩文件到 去。
CMD
:容器启动命令。例:CMD ["nginx" "-g" "daemon off;"]
。
其他命令及讲解:https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/
执行一次即建立一层,编写原则:实现功能,尽可能简洁。
优秀例子:
FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps # 每层末尾执行清除
执行构建命令:docker build -t nginx:v3 .
-t
:标记来添加 tag ,指定新镜像的仓库名;.
: 指定上下问路径,docker 会把上下文路径内容打包发给服务端。
使用 commint
构建镜像:
docker commit -m "jdk-8u112_tomcat-8" -a "Shuai" 4503614af3c3 jdk8_tomcat8
此方式一般用于学习和被入侵后保存现场。会导新致镜像臃肿、不可控。
其它生成镜像的方法:
docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz openvz/ubuntu:14.04
保存镜像:docker save alpine | gzip > alpine-latest.tar.gz
加载镜像:docker load -i alpine-latest.tar.gz
结合 Linux 命令,从当前机器传输镜像到另一台机器:docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
删除镜像:docker rmi [选项] <镜像>
。<镜像>
可以是镜像短 ID 、镜像长 ID 、镜像名或者镜像摘要。
按条件删除:docker rmi $(docker images -q redis)
5.容器
新建并启动容器:docker run ubuntu:14.04 /bin/echo 'Hello world'
,输出一个 “Hello World”,之后终止容器。
- -d:后台运行。
启动已终止容器:docker statr id或name
终止容器:docker stop
。此外,当通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。
查看容器:docker ps
(启动中);docker ps -a
(全部)。
重启容器:docker restart
进入容器:
- 方式一:
docker attach b94d7021d093 /bin/bash
- 方式二:
docker exec -i -t b94d7021d093 /bin/bash
导出容器:docker export 7691a814370e > ubuntu.tar
导入容器:
- 文件方式:
cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
URL 方式:
docker import http://example.com/exampleimage.tgz example/imagerepo
注:用户既可以使用
docker load
导入镜像存储文件
到本地镜像库,也可使用docker import
导入容器快照
到本地镜像库。镜像存储文件
方式将保存完整记录,体积也要大。容器快照文件
方式将将丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器:docker rm trusting_newton
。如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。
终止所有运行中的容器:docker stop $(docker ps -a -q)
清理所有已终止容器:docker rm $(docker ps -a -q)
6.仓库
Docker Hub ( https://hub.docker.com )
登录:
可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
从仓库中搜索镜像:docker search centos
下载官方镜像到本地:docker pull centos
向 Docker Hub 推送镜像:docker push mycentos
自动创建
通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub 或 BitBucket )上的项目,一旦项目发生新的提交,则自动执行创建。
- 创建并登录 Docker Hub,以及目标网站;
- 在目标网站中连接帐户到 Docker Hub;
- 在 Docker Hub 中 配置一个自动创建;
- 选取一个目标网站中的项目(需要含 Dockerfile)和分支;
- 指定 Dockerfile 的位置,并提交创建。
之后,可以 在Docker Hub 的 自动创建页面 中跟踪每次创建的状态。
私有仓库:见参考资料。
7.Docker 数据管理
数据卷:
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点
的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
创建数据卷:
创建一个名为 web 的容器,并加载一个数据卷到容器的 /webapp 目录。
docker run -d -P --name web -v /webapp training/webapp python app.py
删除数据卷:docker rm -v
挂载一个主机目录作为数据卷:
docker run -d -P --name data_share -v /data/heeking/data_share:/home/data_share 镜像
查看数据卷信息:docker inspect web
数据卷容器:
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
创建一个名为 dbdata 的数据卷容器:
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷:
docker run -d --volumes-from dbdata --name db1 training/postgres
可以使用超过一个的--volumes-from
参数来指定从多个容器挂载不同的数据卷。也可以从其他已经挂载了数据卷的容器来级联挂载数据卷:
docker run -d --name db3 --volumes-from db1 training/postgres
*注意:使用 --volumes-from
参数所挂载数据卷的容器自己并不需要保持在运行状态。
*如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v
命令来指定,同时删除关联的容器。
8.使用网络
外部访问容器:
映射到指定地址的指定端口:
docker run -d -p 127.0.0.1:5000:5000 training/webapp
查看映射端口配置:
docker port nostalgic_morse 5000
容器互联:
创建一个新的 web 容器,并将它连接到 db 容器:
docker run -d -P --name web --link db:db training/webapp python app.py
--link
参数的格式为:--link name:alias
,其中 name
是要链接的容器的名称,alias
是这个连接的别名。
高级网络配置:后会有期~