概述
- Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
- Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
CentOS7 Docker 安装
Docker 要求 CentOS 系统的内核版本高于 3.10
1 | # uname -r 命令查看你当前的内核版本 |
启动 Docker 后台服务
1 | [root@izadux3fzjykx7z ~]# sudo systemctl start docker |
本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
1 | { |
删除 Docker CE
1 | $ sudo yum remove docker-ce |
Docker常用命令
列出本地镜像: docker images
1 | docker images -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层); |
docker pull : 从镜像仓库中拉取或者更新指定镜像
1 | docker pull -a :拉取所有 tagged 镜像 |
docker inspec 获取容器/镜像的详细信息
1 | docker inspec 94errf55dter |
docker search : 从Docker Hub查找镜像
1 | docker search mysql |
docker rmi : 删除本地一个或多少镜像(容器)
1 | docker rmi mysql |
docker ps : 列出容器
1 | -a :显示所有的容器,包括未运行的。 |
如何创建一个镜像
创建镜像的方法又三种:基于已有镜像的容器创建,基于本地模板导入,基于
Dockerfile
创建
docker commit
:从容器创建一个新的镜像
1 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
首先启动一个镜像 为容器重新分配一个伪输入终端 以交互模式运行容器
1 | docker run -ti ubuntu:14.04 /bin/bash |
存储和载入镜像
可以使用
docker save
和docker load
来存储和载入镜像
docker save
: 将指定镜像保存成 tar 归档文件
1 | # 保存咋当前目录下 |
docker load
: 载入一个镜像
1 | docker load --input test.tar |
上传镜像
docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
1 | # 可以先添加新的标签 user/test:latest 然后用docker push 上传 |
容器的基本操作
容器是镜像的一个实例,所不同的是,它带有额外的可写文件层
创建容器
docker create
:创建一个新的容器但不启动它
1 | [root@izadux3fzjykx7z ~]$ docker create -it ubuntu:14.04 |
新建并启动容器
1 | [root@izadux3fzjykx7z ~]$ docker run ubuntu:14.04 /bin/echo 'hello world' |
后台启动一个容器运行
1 | [root@izadux3fzjykx7z ~]$ docker run -d ubuntu /bin/sh -c "while true;do echo hello word;sleep 1;done" |
终止容器
docker stop
命令来中止一个运行中的容器,它会向容器发送信号,等待一段时间后在发送信号终止器docker kill
命令会直接中止容器1
2[root@izadux3fzjykx7z ~]$ docker stop 471
471
查看处于中止状态的容器ID
1 | [root@izadux3fzjykx7z ~]$ docker ps -a -q |
处于中止的容器 可以用过 docker start
重新启动
1 | [root@izadux3fzjykx7z ~]$ docker start 471 |
重启一个容器
1 | [root@izadux3fzjykx7z ~]$ docker restart 471 |
如何进入容器
docker attach
:连接到正在运行中的容器。- 当多个窗口同时attach 到同一个容器时,所有窗口都会同步显示,如果某个窗口操作的命令阻塞了,所有的窗口都会阻塞
1 | [root@izadux3fzjykx7z ~]$ docker attach 471 |
- docker exec:在运行的容器中执行命令。可以直接进入容器操作命令
1
2
3
4[root@izadux3fzjykx7z ~]$ docker exec -ti 47168308c196 /bin/bash
root@47168308c196:/$ ls -l
drwxr-xr-x 2 root root 4096 Mar 7 21:01 bin
drwxr-xr-x 2 root root 4096 Apr 24 2018 boot
删除容器
- 可以使用
docker rm
命令删除处于终止状态的容器。命令为docker rm
- -f ,–force=false 强行终止并删除一个运行中的容器
- -l,–link=false 删除容器的链接 但保留容器
- -v,–volumes=false, 删除容器挂载的数据券
1 | [root@izadux3fzjykx7z ~]$ docker ps -a |
导入和导出容器
docker export
:将文件系统作为一个tar归档文件导出。不管这个容器是否处于运行状态
1 | [root@izadux3fzjykx7z ~]$ docker export 47168 > test_stop.tar |
- 导出的容器可以使用
docker import
导入成为镜像
1 | [root@izadux3fzjykx7z ~]$ cat test_stop.tar | docker import - test/ubuntu:v1.0 |
- 既可以使用
docker load
命令导入一个镜像文件。也可以使用docker import
导入一个容器快照到本地镜像库。两者的区别在于:快照文件将丢弃所有的历史记录和元数据信息。而镜像存储文件将保存完整记录。体积也要大。从容器快照文件导入时可以重新指定标签等元数据信息。
创建和使用私有仓库
- 官方提供了registry镜像来搭建一套本地私有仓库的环境
-v
用户指定镜像文件存储的路径 默认路径是容器的/tmp/registry
目录下1
2
3# 自动下载并启动一个registry容器 创建一个本地私有仓库
[root@izadux3fzjykx7z ~]$ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
# 此时本地将启动一个私有仓库,监听端口为5000
然后在本地电脑上安装一个docker
上传镜像到服务器
1 | #首先使用docker命令标记一个镜像格式为 |
- Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误
- 这个问题需要在启动docker server时增加启动参数为默认使用http访问。修改
daemon.json
文件
1 | { |
查看镜像推送结果:
curl http:39.108.144.143:5000/v1/search
下载私有仓库镜像:docker pull 39.108.144.143:5000/hellp-world
数据管理
- 容器中管理数据主要有两种方式: 数据卷,数据卷容器
数据卷
数据卷是一个可供容器使用的特许目录,它绕过文件系统,可以提供很多有用的特性
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立即生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用。数据卷的使用类似Linux目录下或文件mount操作。
如何在容器中创建一个数据卷
1 | # 使用training/webapp创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录 |
数据卷容器
- 如果需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
- 数据卷容器其实就是一个普通的容器,专门用它提供数据卷 供其它容器挂载使用
1 | # 创建数据卷容器 ,并在其中创建一个数据卷挂载到 /dbdat |
- 如果删除了挂载的容器,数据卷不会自动删除,如果要删除一个数据卷,必须删除最后一个还挂着它的容器时显示使用docker rm -v命令来指定同时删除关联的容器
- 使用容器卷可以让用户在容器之间自由升级和移动数据卷
网络基础配置
- 使用-P标记时,Docker会随机映射一个端口
1 | [root@izadux3fzjykx7z ~]# docker run -d -P --name fe9531 -v /webapp training/webapp python app.py |
Dockerfile命令语法
- Dockerfile 是由一行行命令组成,一般二言分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时指令
FROM
- 功能为指定基础镜像,并且必须是第一条指令。
- 如果不以任何镜像为基础,那么写法为:FROM scratch。
- 同时意味着接下来所写的指令将作为镜像的第一层开始
1
2
3
4
5语法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
MAINTAINER
- 构建指令,用于将image的制作者相关的信息写入到image中
RUN
镜像操作指令。RUN命令有两种格式
1 | RUN <command> |
- 第一种后边直接跟shell命令。在linux操作系统上默认
/bin/sh -c
- 在windows操作系统上默认
cmd /S /C
- 第二种是类似于函数调用。可将
executable
理解成为可执行文件,后面就是两个参数。
CMD
- 容器启动时要运行的命令。语法有三种写法:
1 | CMD ["executable","param1","param2"] |
- 第三种比较好理解了,就时shell这种执行方式和写法
- 第一种和第二种其实都是可执行文件加上参数的形式
- 这里边包括参数的一定要用双引号,就是”,不能是单引号。千万不能写成单引号。原因是参数传递后,docker解析的是一个JSON array
LABEL
- 功能是为镜像指定标签.。LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
1 | 语法: |
创建支持SSh的服务镜像
基于commit 命令创建
1 | # 首先创建一个容器 |
使用Dockerfile创建
首先应创建一个sshd_ ubuntu 工作目录:
1 | $ mkdir sshd ubuntu |
编写Dockerfile文件
1 | #设置继承镜像 |
创建镜像
1 | #在sshd_ ubuntu 目录下,使用docker build 命令来创建镜像。注意一下,在最后还有一个“.”,表示使用当前目录中的Dockerfile. |
Docker 安装 Nginx
1 | # 查询 |
Docker 安装 Tomcat
1 | $ docker pull tomcat |
使用docker安装ElasticSearch
1 | # 使用docker安装ElasticSearch |
Docker 安装 MySQL
1 | $ docker search mysql |
Docker 安装 Redis
1 | $ docker search redis |