Docker 学习笔记

#linux   #笔记   #Docker  

作者 Tenie
2017-07-17 00:00:00 字数: 9200 阅读: 3 评论: 0

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