# Docker
定稿人 | 定稿日期 | 系统环境
| :--------: | :-----: | :----: |
黄镇游 | 2017.12.19 |ubuntu14.04
## Docker入门实践
#### docker环境搭建
1.获取最新版的Docker安装包
```powershell
$ wget -qO- https://get.docker.com/ | sh
```
2.直接使用`docker`无须加 `sudo`
```powershell
$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service docker restart
# 单条指令
sudo usermod -aG docker $USER # 把当前用户加入docker组
```
3 . 从 `17.04` 以后,可以用下面的命令安装。
```powershell
$ export CHANNEL=stable
$ curl -fsSL https://get.docker.com/ | sh -s -- --mirror Aliyun
```
#### 镜像基本操作指令
1.搜索镜像
```powershell
$ sudo docker search ubuntu
```
2.获取镜像
```powershell
$ sudo docker pull ubuntu
```
3.查看镜像信息
```powershell
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ccc7a11d65b1 3 weeks ago 120MB
swarm latest 7ecf8baf8eae 8 weeks ago 15.8MB
```
4.查看镜像的详细信息
```powershell
$ sudo docker inspect 7ecf8baf8eae
#或
$ sudo docker inspect ubuntu
```
5.删除镜像
```powershell
$ sudo docker rmi swarm
Error response from daemon: conflict: unable to remove repository reference "swarm" (must force) - container c445ef19d3e7 is using its referenced image 7ecf8baf8eae
```
> **因此,删除镜像之前得确保容器已删除**
6.删除容器
```powershell
$ sudo docker rm 7ecf8baf8eae #删除指定容器
$ sudo docker rm $(docker ps -a -q) #删除所有已生成容器
```
7.复制镜像
```sh
$ sudo docker tag ubuntu:latest hzy/test:latest
hzy@hadoop:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hzy/test latest ccc7a11d65b1 3 weeks ago 120MB
ubuntu latest ccc7a11d65b1 3 weeks ago 120MB
swarm latest 7ecf8baf8eae 8 weeks ago 15.8MB
```
#### 创建镜像
1.创建一个新镜像,进行操作
```powershell
$ docker run -it ubuntu /bin/bash --name bieming
root@3138d574074e:/#
```
2.使用 `docker commit` 来提交一个新的镜像
```powershell
$ sudo docker commit -m "added a new file" -a "huangzy" 3138d574074e hzy/test
3138d574074esha256:f8b1d41ff97589f7c207577b391b1d5074b197a1ec3196a8907269ec6e00dcae
# -a, --author="" 作者信息
# -m, --message="" 提交消息
# -p, --pause=ture 提交时暂停容器运行
```
#### 存出和载入镜像
1.存出镜像
```powershell
$ sudo docker save -o ubuntu.tar ubuntu:latest
```
2.载入镜像
```powershell
$ sudo docker load --input ubuntu.tar
Loaded image: ubuntu:latest
#或
$ sudo docker load < ubuntu.tar
```
#### 容器
1.创建容器
```powershell
$ sudo docker run -it ubuntu:latest /bin/bash
root@939831baa91d:/#
# -t 分配一个伪终端绑定到容器的标准输入上
# -i 让容器的标准输入保持打开
# -d 让Docker容器在后台以守护态(Daemonized)形式运行
```
2.终止容器
```powershell
$ sudo docker stop 939831b
```
3.查看容器状态
```powershell
$ sudo docker ps
#或
$ sudo docker ps -a -q # 可查看到终止状态的容器
```
4.使用 `docker start` 命令来重新启动处于终止状态的容器
```powershell
$ sudo docker start 939831b
#或
$ sudo docker restart 939831b
```
5.删除容器
```powershell
$ sudo docker rm 3138d574074e
Error response from daemon: You cannot remove a running container 3138d574074e5a45a543760c2ecb3935b0173d89940c05fa3cd969d1112338ff. Stop the container before attempting removal or force remove
#应该先停止容器服务,再进行删除。
$ sudo docker stop 3138d574074e
```
#### 导入和导出容器
1.导出容器(无论该容器是否处于运行状态)
```powershell
$ sudo docker export 3138d > test_for_run.tar
```
2.导入容器(导出的文件可以导入,成为镜像)
```powershell
$ cat test_for_run.tar | sudo docker import - test/ubuntu:v1
sha256:b974a00be6dd0ac5f794c3ec5ef6b1812cdc535390b67950cf220aa1e557c759
```
#### 仓库(Repository)
> 仓库:是集中存放镜像的地方。
>
> 注册服务器(Registry):是存放仓库的具体服务器。
1.终端登录Docker Hub
```powershell
$ sudo docker login
[sudo] password for hzy:
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: s152118130110
Password:
Login Succeeded
```
2.将本地镜像推送到Docker Hub
```powershell
$ sudo docker push swarm:latest
```
#### 创建和使用私有仓库
1.默认情况下,会将仓库存放于容器的 /tmp/registry 目录下,如果容器被删除,则数据也会丢失,所以我们可以通过 -v 参数来将镜像文件存放在本地的指定路径
```powershell
$ sudo docker run –d –p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
# -i: 保持sdtin开放状态
# -d: 使容器以守护进程方式后台运行,并打印容器id
# -t: 分配一个tty(虚拟终端设备)
# -v: 绑定挂载一个容器内的路径到宿主机路径
# -p: 映射一个容器的端口到宿主机端口
# -restart: 当容器退出时的重启策略
# -name: 给容器命名一个名称
```
> 打开chrome输入 `http://127.0.0.1:80/v2`
2.标记
```powershell
$ sudo docker tag swarm 192.168.18.19:5000/swarm
```
3.上传
```powershell
$ sudo docker push 192.168.18.19:5000/swarm
The push refers to a repository [192.168.18.19:5000/swarm]
Get https://192.168.18.19:5000/v2/: http: server gave HTTP response to HTTPS client
#由于客户端采用https,docker registry未采用https服务所致。一种处理方式是把客户对地址“192.168.1.100:5000”请求改为http
#在 "etc/docker" 目录下,创建daemon.json文件,并在文件写入:
{"insecure-registries":["ip地址:5000"]}
#重新启动docker
$ sudo service docker restart
#重新上传镜像即可
$ sudo docker push 192.168.18.19:5000/swarm
# 查看上传是否成功
$ curl http://192.168.18.19:5000/v2/_catalog
{"repositories":["swarm"]}
```
4.下载镜像
```powershell
$ sudo docker pull 192.168.18.19:5000/swarm
```
#### 客户机访问Registry
1.对于需要访问Registry仓库的客户机,需要修改文件。
```powershell
# ubuntu 在以下文件添加 {"insecure-registries":["192.168.18.19:5000]}
$ vi /etc/docker/daemon.json
# centos 在以下文件添加 OPTIONS=‘--SELINUXENABLED--INSECUREREGISTRY192.168.18.19:5000’
$ vi /etc/sysconfig/docker
```
#### 数据卷
1 . 使用 `-v`标记可以指定挂载一个本地的目录到容器中
```powershell
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
# 地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
```
2 . 使用 `-v` 标记也可以从主机挂载单个文件到容器中
```powershell
$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
# 这样可以记录在容器输入过的命令
```
## Docker 命令
#### 容器
```bash
$ docker ps # 正在运行的容器
$ docker ps -a # 所有容器
$ docker ps -a | grep 'Exited' # 退出的容器
$ docker inspect [container] # 容器信息
$ docker rename [container] [new_name] # 修改名称
$ docker rm -f -v [container] # 删除容器,-f:强制删除,无论是否在运行,-v:删除自动挂载的 volume(volume name是随机生成的), 如果是手动挂载的 volume 不会被删除
```
```bash
# 运行容器
# -it: 交互模式
# --net: 使用的网络, --net 等同于 --network
# -p: 主机与容器的端口映射(-p 8080:8080 或 -p 192.168.1.2:8080:8080), -p 等同于 --public
# -P: 把容器的端口随机映射到主机,这里容器端口指的是 Dockerfile EXPOSE 出来的端口
# -e: 环境变量, -e 等同于 --env
# --add-host:添加主机和IP的映射(--add-host centos192:192.168.1.192, 会被添加到容器的 /etc/hosts), 一次只添加一个
# --dns: 添加 dns 到容器的 /etc/resolv.conf,一次只添加一个
# -d: 后台运行, -d 等同于 --detach
# -v 挂载(针对目录而言), 挂载到主机:-v /var/lib/mysql:/data/mysql,挂载到卷: -v mysql_data:/data/mysql
# --entrypoint
$ docker run -it --name [container] --net [network] --ip [ip] --hostname [host] -p [port:port] -e [ENV=...] --add-host [host:ip] --dns [8.8.8.8] -v [volume:/container/path] --entrypoint [cmd] -d [image:tag]
```
```bash
$ docker exec -it [container] bash # 进入容器并指定 bash 命令
```
```bash
$ docker export [container] [xxx.tar] # 导出容器文件系统为 tar 包
$ docker import [xxx.tar] # 导入 tar 包创建文件系统镜像
$ docker commit [container] [image:tar] # 将容器的修改创建成镜像
```
```bash
# 在主机和容器之间 copy 数据
$ docker cp /root/docker-entrypoint.sh mysql:/usr/local/bin/ # 主机 -> 容器
$ docker cp mysql:/usr/local/bin/docker-entrypoint.sh /root/ # 容器 -> 主机
```
```bash
$ docker top [container] # 查看容器中正在运行的进程
$ docker diff [container] # 查看容器内发生变化的文件
$ docker events # 实时输出服务端事件,包括容器的创建,启动,关闭等
$ docker logs (-f) [container] # 容器日志
```
#### 镜像
```bash
$ docker images # 所有镜像
$ docker images | grep 'none' # 空镜像
$ docker history [image] # 镜像历史
$ docker tag [image:tag] [new_image:tag] # 重命名镜像
$ docker rmi [image] # 删除镜像
```
```bash
$ docker save -o nginx-1.11.9-alpine.tar nginx:1.11.9-alpine # 打包镜像成 tar 包
$ docker load -i nginx-1.11.9-alpine.tar # 从 tar 包中加载镜像
```
#### 存储卷
```bash
$ docker volume ls # 所有卷
$ docker volume inspect [volume] # 卷信息
$ docker volume rm [volume] # 删除卷
$ docker volume create --driver local [volume] # 创建本地卷
$ docker volume create --driver rexray [volume] # 基于 rexray 卷插件创建卷(需要先安装 rexray 卷插件)
```
#### 网络
docker 1.12 自带网络插件:`bridge`(默认)、`host`、`macvlan`、`null`和`overlay`
```bash
$ docker network ls # 所有网络
$ docker network inspect [network] # 网络信息
$ docker network rm [network] # 删除网络
$ docker network create --driver bridge --subnet 172.17.2.0/24 --gateway 172.17.2.1 mynet # 创建本地网络,默认的 bridge 驱动自动桥接到系统虚拟网卡 docker0
$ docker network create --driver calico --ipam-driver calico --subnet [CIDR] [network_name] # calico 网络(需要先安装 calico 网络插件)
```
#### 监控
```bash
$ docker stats # 监控容器消耗的资源,CPU、内存、网络 I/O
```
- Docker
- Docker入门
- docker管理UI
- 封装各大数据组件
- 自主封装
- 封装hadoop
- 封装spark
- 官方封装
- 封装hue
- 封装jenkins
- Swarm
- Swarm入门
- Zookeeper on swarm
- Hue on swarm
- Grafana
- influxDB
- Prometheus
- cAdvisor
- kubernetes
- k8s入门
- k8s部署dashboard
- minikube
- 手动搭建k8s的高可用集群
- 01环境准备
- 02部署etcd集群
- 03配置kubelet
- 04部署flannel网络
- 05部署master集群
- 06配置高可用
- 07部署node节点
- 08验证集群
- Monitor
- swarm 监控
- influxDB+Grafana
- Prometheus+Grafana