Docker note
安装脚本
wget -qo- https://get.docker.com/ | sh 等价于 curl -fsSL https://get.docker.com/ | sh //执行这个脚本会添加 docker.repo 源并安装 Docker。
CentOS安装 yum -y install docker //查看内核(内核不能低于): uname -r 3.10.0-327.el7.x86_64
启动docker
sudo service docker start
Hello World
$ docker run ubuntu:15.10 /bin/echo "Hello World!" //Docker以ubuntu15.10镜像创建一个新容器,然后在容器里执行echo命令, 然后输入结果
> Hello World!
参数解析:
run: 与前面的docker组合运行一个容器
ubuntu:15.10: 指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,不存在会从Docker的镜像仓库Docker Hub下载公共镜像
/bin/echo "Hello World!":在启动的容器里执行的命令
运行交互是的容器
$ docker run -i -t ubuntu:15.10 /bin/bash //在当前终端中打开一个容器的终端; 可以使用exit或CTRL-D退出容器
参数解析:
-i 运行你对容器内的标准输入(stdin)进行交互
-t 在新容器内指定一个终端或为终端.
后台启动模式
$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
> 2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
在输出中,没有输出hello world, 而是一窜字符串, 该字符串是容器ID,对灭国容器来说都是唯一的,可以通过该ID来查看对应容器发生了什么.
$ docker ps
会看到几个关键字:
CONTAINER ID: 容器ID
NAMES: 自动分配的的容器名称
使用 "docker logs 容器id或name" 可以查看容器的标准输出
$ docker logs 2b1b7a428627
停止容器
$ docker stop 2b1b7a428627
运行一个web应用(端口和本机映射)
$ docker run -d -P raining/webapp python app.py // raining/webapp: 容器, python app.py:启动一个python 的web服务器
参数说明:
-d 让容器在后台运行
-P 将容器内部使用的网络端口映射到我们使用的主机上.(此时是随机的,因为没有指定本机端口是哪个)
通过 docker ps 或者docker port id 可以看到端口映射关系
输出中有一个信息: 0.0.0.0:32769->5000/tcp //docker开放了5000端口, 映射到主机端口32769上
现在可以 http://localhost:32769 来访问容器中的web服务器了
使用-p 来自定义端口映射:
$ docker run -d -p 5000:5000 OS command .. //把容器的5000端口映射到主机5000端口
快速查看网络端口的方式
$ docker port OS_ID或name
> 5000/tcp -> 0.0.0.0:5000
查看程序日志
$ docker logs -f OS_ID或name
参数解析:
-f 类似命令tail -f 来查看容器内部的标准输出
查看容器内的应用程序进程
$ docker top OS_ID或name //查看容器内运行的进程
查看容器的底层信息
$ docker inspect OS_ID或name //返回一个JSON,记录着Docker容器的配置和状态信息
暂停容器
$ docker stop OS_ID或name
启动暂停的容器
$ docker start OS_ID或name
重启容器
$ docker restart OS_ID或name //在重启前可以使用docker ps -l 来查看正在运行的容器
移除容器
$ docker rm OS_ID或name //删除容器时,容器必须是停止状态,不然报错
Docker镜像使用
列出镜像列表
$docker images //查看本地有多少个已经下载的镜像;列表中的字段涵义如下:
1.REPOSTITORY: 镜像的仓库源
2.TAG:镜像的标签(版本号)
3.IMAGE ID:
4.CREATED: 镜像创建时间
5.SIZE:
使用中要注意的:
如果一个镜像仓库源有多个TAG,(多个版本),那么在运行的使用如果不知道TAG,那么会默认运行latest镜像
获取一个镜像
使用一个镜像的时候,本机不存在,docker会自动下载, 如果要预先下在可以使用pull命令:
$ docker pull IOS:TAG //下载一个指定版本号的镜像
查找镜像
可以Docker Hub 网站上搜索镜像,网站:https://hub.docker.com/
也可以使用命令来搜索
$ docker search iosName //该命令会显示多个字段,解释如下:
1.NAMEE: 镜像仓库源的名称
2.description: 镜像的描述
3.OFFICIAL: 是否docker官方发布
创建自己的镜像
自定义镜像,两种方式,
1.在已经创建的容器中更新镜像,并提交这个镜像
2.使用Dockerfile质量创建一个新的镜像
1.更新镜像:
在交互模式下,对当前的镜像安装程序后,使用exit退出;如下:
runoob@runoob:~$ docker run -t -i iosName /bin/bash
root@e218edb10161:/# apt-get update
root@e218edb10161:/# exit
runoob@runoob:~$ docker commit -m="has update" -a="作者" e218edb10161 IOS_NAME:v2
各参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161: 容器ID
IOS_NAME:v2:要创建的目标镜像名
此时使用docker images 就能看到自己创建的IOS_NAME:v2镜像了
2.使用Dockerfile文件构建一个镜像,如下:
$ vi Dockerfile //创建一个文件,内容如下,
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
内容的说明
每一行指令都都是大写开头的。
FROM,指定使用那个镜像源为基础
RUN, 在镜像内执行的linux命令,(可以安装软件)
构建镜像
docker build -t tenie/centos:6.7 .
参数说明:
-t: 指定要创建的目标镜像名
. :Dockerfile文件所在目录,只使用绝对路径
设置镜像标签
可以给同一个镜像设置多个标签和名字,其实用的是同一个镜像文件
$ docker tag id 名字:标签
Docker容器连接
网络端口映射
$ docker run -d -P training/webapp python app.py
改命令会把后台开启一个web服务器容器,把web的访问端口映射给本机端口(随机本机端口)
-P: 是容器内部端口映射到本机的某个端口(随机)
$ docker run -d -p 5000:5000 training/webapp python app.py
-p: 容器内部端口绑定到指定的主机端口
$ docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py
指定容器绑定的网络地址;我们可以通过127.0.0.1:5001来访问容器的5002端口,
这里默认绑定tcp端口,如果要绑定UPD端口,要在端口后面加上/udp;如下:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看容器端口绑定的情况
$ docker port 容器id 5002
> 127.0.0.1:5001
Docker容器连接
docker有一个连接系统允许将多个容器连接在一起,共享连接信息
容器命名
创建容器的时候docker会自动对它进行命名, 我们可以使用--name来命名容器:
$ docker run -d -P --name runoob training/webapp python app.py
Docker安装Nginx
构建Nginx前的准备工作,
创建目录:
$ mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf
www目录将映射为nginx容器配置的虚拟目录
logs目录将映射为nginx容器的日子目录
conf目录里的配置文件将映射为nginx容器的配置文件
创建nginx镜像有2种,使用Dockerfile或者直接下载镜像;直接下载的方式如下:
$ docker search nginx //搜索公共仓库
$ docker pull nginx //下载官方的nginx
使用nginx镜像
运行容器:
$ docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.congf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx
参数解析:
-p 80:80 将容器80端口映射到主机的80端口
--name mynginx 将容器命名为mynginx
-v $PWD/www:/www 将主机中当前目录下的www挂载到容器的/www //-v 选项用来映射目录
Docker安装PHP
准备:
$ mkdir -p ~/php-fpm/logs ~/php-fpm/conf
下载镜像
$ docker pull php:5.6-fpm
运行
$ docker run -p 9000:9000 --name myphp-fpm -v ~/nginx/www:/www -v $PWD/conf:/usr/local/etc/php -v $PWD/logs:/phplogs -d php:5.6-fpm
Docker 安装Tomcat
准备
$ mkdir -p ~/tomcat/webapps ~/tomcat/logs ~/tomcat/conf
webapps目录将映射为tomcat容器配置的应用程序目录
logs目录将映射为tomcat容器的日志目录
conf目录里的配置文件将映射为tomcat容器的配置文件
拉镜像
$ docker pull tomcat
运行
~/tomcat$ docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat
命令说明:
-p 8080:8080:将容器的8080端口映射到主机的8080端口
-v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test
Docker 命令大全
run : 创建一个新的容器并运行一个命令
语法: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
start/stop/restart: 分别表示:启动一个或多个已经被停止的容器/停止/重启
kill: 杀掉一个运行中的容器;和stop类似
rm: 删除一个或多个容器
语法:docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-f :通过SIGKILL信号强制删除一个运行中的容器
-l :移除容器间的网络连接,而非容器本身(2个容器之间的连接)
-v :-v 删除与容器关联的卷(删除容器挂载的数据卷)
pause/unpause: 暂停容器中所有的进程/恢复容器中所有的进程
create: 创建一个新的容器但不启动它;用法和run一样
exec: 在运行的容器中执行命令(一个在后台运行的容器想和打开它的终端用这个很容易)
语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
ps: 列出容器
OPTIONS说明:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
inspect: 获取容器/镜像的元数据
语法:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
PTIONS说明:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
例子: 获取正在运行的容器mymysql的 IP。
$ docker inspect -f '{{.NetworkSettings.IPAddress}}' mymysql
> 172.17.0.3
top: 查看容器中运行的进程信息, 支持ps命令参数
有的容器不一定有top命令,所有用这个docker top可以查看了
attach: 连接正在运行的容器
连接上后只能看标准输出
例子: docker attach --sig-proxy=false mynginx //参数--sig-proxy=false 如果不加, 那么CTRL-C的时候会中断容器
events: 查看docker 的事件(也可以理解为日志,做过什么操作)
语法:docker events [OPTIONS]
OPTIONS说明:
-f :根据条件过滤事件;
--since :从指定的时间戳后显示所有事件;
--until :流水时间显示到指定的时间为止;
logs: 获取容器的日志(测试了几下,输出的是标准输出的内容)
语法:docker logs [OPTIONS] CONTAINER
OPTIONS说明:
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
port: 列出指定容器的端口映射;或者查找将PRIVATE_PORT NAT到面向公众的端口。
语法:docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
commit: 从容器创建一个新的镜像
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
cp: 用于容器与主机之间的数据拷贝
语法:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS说明:
-L :保持源目标中的链接
实例:
将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www
diff: 检查容器里文件结构的更改
login/logout: 登入一个镜像仓库,没指定地址, 默认为官方仓库Docker Hub/登出
语法:docker login/logout [OPTIONS] [SERVER]
OPTIONS说明:
-u :登陆的用户名
-p :登陆的密码
pull: 从仓库中拉取或更新指定镜像
语法: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
-a :拉取所有 tagged 镜像(所有的相关镜像都会下载!)
--disable-content-trust :忽略镜像的校验,默认开启
push: 把本地的镜像上传到镜像仓库, 要先登入到仓库镜像
语法: docker push [OPTIONS] NAME[:TAG]
OPTIONS说明:
--disable-content-trust :忽略镜像的校验,默认开启
search: 从Docker Hub查找镜像
语法:docker search [OPTIONS] TERM
OPTIONS说明:
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
-s :列出收藏数不小于指定值的镜像。(stars数不小于多少)
images: 列出本地镜像
语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
rmi: 删除本地一个或多个镜像
语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;
tag: 标记本地镜像, 将其归入某一仓库(其实就是该镜像名)
语法:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
例子:
将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。
docker tag ubuntu:15.10 runoob/ubuntu:v3
build: 使用Dockerfile创建镜像
语法:docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
-q :安静模式,成功后只输出镜像ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
-t: 指定要创建的目标镜像名
例子:
使用当前目录的Dockerfile创建镜像。
docker build -t runoob/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
history: 查看指定镜像的创建历史 (哪些docker 命令的操作记录)
语法:docker history [OPTIONS] IMAGE
OPTIONS说明:
-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
save: 将指定镜像保存成tar归档文件
语法:docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-o :输出到的文件。
实例:
将镜像runoob/ubuntu:v3 生成my_ubuntu_v3.tar文档
$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
$ ll my_ubuntu_v3.tar
> -rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.ta
import:从归档文件中创建镜像
语法:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
OPTIONS说明:
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
info: 显示Docker 系统信息
version: Docker版本信息
windows 中启动docker
启动docker后使用下面命令,进入linux虚拟机,在该虚拟机中可以创建docker容器了
boot2docker.exe ssh
进入linux虚拟机后的用户是docker 密码是tcuser