Docker
架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Hello World
$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
运行交互式的容器
我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现**“对话”**的能力:
$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
各个参数解析:
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
镜像
- 查看本地镜像 docker images
- 查找镜像 docker search
- 拉取镜像 docker pull
- 删除镜像 docker rmi -f
- 上传镜像 docker push
- 使用镜像创建容器并启动 docker run
- [-i] 以交互式运行
- [-t] 为容器重新分配一个伪输入终端
- [–name ] #创建一个名称centos_aways的容器,自动重启
- [–restart]:always始终重启;on-failure退出状态非0时重启;默认为,no不重启
- [-p] : <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。
- -d : 表示使用守护进程运行,即服务挂在后台
- -P :随机的端口映射
-v
:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭
-
使用镜像创建容器
docker create
-t, –tty Allocate a pseudo-TTY
-i, –interactive Keep STDIN open even if not attached
-d, –detach Run container in background and print container ID #run的参数
-
容器资源限制参数
-
-m 1024m –memory-swap=1024m # 限制内存最大使用(bug:超过后进程被杀死)
-
–cpuset-cpus=“0,1” # 限制容器使用CPU
-
exp:运行一个mysql容器
sudo docker run --name first-mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
-
run 运行一个容器
-
–name 后面是这个镜像的名称
-
-p 3306:3306 表示在这个容器中使用3306端口(第二个)映射到本机的端口号也为3306(第一个)
-
-d 表示使用守护进程运行,即服务挂在后台
容器
-
查看容器
- docker ps
- -l:列出最近一次启动的container
- -a :列出所有的container(包含历史,即运行过的container)
- -q :列出最近一次运行的container ID
- -n:上几次运行的container
- docker ps
-
启动容器
-
docker start 容器名称
-
docker start 容器id
-
-
重启容器
- docker restart
-
停止容器
-
docker stop 容器名称
-
docker stop 容器id
-
docker kill 容器名称
-
docker kill 容器id
-
-
退出容器
-
docker exit 容器停止退出到宿主机
-
ctrl+p+q 容器不停止退出到宿主机
-
-
链接容器
-
docker attach 容器id :重新进入到容器
-
docker exec -it 容器id /bash/shell :可以执行后直接得到结果,而不用进入到容器
-
-
查看容器中的信息
- docker top 容器id
-
容器日志
- docker logs -f[最新] -t[时间戳] –tail[显示最多多少条] 容器id
-
容器与主机之间的数据拷贝
- docker cp 容器id:容器内路径 目的主机路径
-
检查容器里文件结构的更改
- docker diff
-
删除容器
-
docker rm <container…> #:删除一个或多个container
-
docker rm
docker ps -a -q
#:删除所有的container -
docker ps -a -q | xargs docker rm #:同上, 删除所有的container
-
-
已root权限进入
第一步:查看容器的CONTAINER ID
docker ps
第二步:获取root权限,例如需要进入的CONTAINER ID为4650e8d1bcca
docker exec -ti -u root 4650e8d1bcca bash
导入导出
一、使用 export 和 import
导出镜像
(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。
docker export f299f501774c > hangger_server.tar
导入镜像
(1)使用 docker import 命令则可将这个镜像文件导入进来。
docker import - new_hangger_server < hangger_server.tar
二、使用 save 和 load
保存镜像
(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。
docker save 0fdf2b4c26d3 > hangge_server.tar
(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgres 和 mongo 打包:
docker save -o images.tar postgres:9.6 mongo:3.4
载入镜像
使用 docker load 命令则可将这个镜像文件载入进来。
docker load < hangge_server.tar
附:两种方案的差别
1,文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像
2,是否可以对镜像重命名
- docker import 可以为镜像指定新名称
- docker load 不能对载入的镜像重命名
3,是否可以同时将多个镜像打包到一个文件中
- docker export 不支持
- docker save 支持
4,是否包含镜像历史
- export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
- 而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
5,应用场景不同
- docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
- docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
通用
docker inspect 容器id/镜像 :获取详细信息
镜像制作
手动修改镜创建镜像
docker commit 镜像ID 新镜像名称:新镜像标签
docker脚本创建镜像
docker build -t 镜像:标签 dcocker脚本路径
Dockerfile
Dockerfile语法格式
- – FROM:基础镜像 //docker image 查看填写要做用的样版镜像
- – MAINTAINER:镜像创建者信息 //可选项
- – EXPOSE:开放的端口 //要打开哪个端口
- – ENV:设置变量 //像systemctl的,可查看/usr/lib/systemd/system下*.service文件项
- – ADD:复制文件到镜像并解压 //必须存放在和Dockerfile文件同一目录下
- – COPY:复制文件到镜像
- – RUN:制作镜像时执行的命令,可以有多个
- – WORKDIR:定义容器默认工作目录 //相当于cd到哪个目录下
- – CMD:容器启动时执行的命令,仅可以有一条CMD
- – ENTRYPONT: 容器启动时执行的命令,可以有多个
- – ONBUILD:被继承时,ONBUILD可以被触发