Centos下安装
- Uninstall old versions
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- Install using the repository
# Install required packages
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# Use the following command to set up the stable repository
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- INSTALL DOCKER ENGINE - COMMUNITY
sudo yum install docker-ce docker-ce-cli containerd.io
- Start Docker
sudo systemctl start docker
- Verify that Docker Engine
sudo docker run hello-world
Docker Image
概念
todo
vagrant用户使用docker命令
- 授权
# Adding user vagrant to group docker
sudo gpasswd -a vagrant docker
sudo service docker restart
- 重新登陆
exit
vagrant ssh
pull太慢问题
sudo vim /etc/docker/daemon.json
{
"registry-mirrors" : ["https://docker.mirrors.ustc.edu.cn"]
}
sudo service docker restart
构建
-
自己构建Base Image
- c文件
#include<stdio.h> int main() { printf("hello docker\n"); }- 编译
gcc -static hello.c -o hello- Dockerfile
# 制做Base Image FROM scratch ADD hello / CMD ["/hello"]- 构建
docker build -t zzh/test .- 运行
docker run zzh/test -
在已有Base Image基础上构建Image
- 方式一:命令
# 拉一个centos的Image docker pull centos # 相互模式运行centos docker run -it centos # 下载vim yum install vim -y # 退出container exit; # 查询container docker container ls -a # 构建Image docker build docker commit -a "zzh" -m "centos with vim" ac327be41bb1 zzh/centos # 清理所有container docker rm $(docker container ls -aq) # 清理Image docker rmi 21fb0d14f197- 方式二:Dockerfile
# Dockerfile文件 # 使用Base Image From centos yum install vim -y# 构建命令 docker build -t zzh/centos-vim . # 退出container exit; # 清理所有container docker rm $(docker container ls -aq) # 清理Image docker rmi ae813e1893f3- 本质(只是在centos基础上多了一层Image Layer)

Docker Container
概念
todo
Dockerfile
- 例子:官方Dockerfile
- 文档:官方Dockerfile文档说明
- FROM
# 制作Base Image
FROM scratch
# 使用Base Image
FROM centos
- LABEL(metadata)
LABEL maintainer="xxx@qq.com"
LABEL version="1.0"
LABEL description="test"
- RUN
# &&联接两个命令,\换行,一个RUN一层,建议用&&写一起,避免无用分层
RUN yum update && yum install -y vim \
python-dev
- WORKDIR
# 不存在就创建
WORKDIR /test
WORKDIR demo
# 结果/test/demo,不要使用RUN cd,尽量使用绝对路径
RUN pwd
- ADD && COPY
# 相同:把文件拷贝到指定目录
# 不同:ADD如果拷贝压缩文件会自动解压,优先使用COPY
ADD hello /
COPY hello /
# /root/test/hello
WORKDIR /root
ADD hello test/
- ENV
# 定义常量,之后用"${MYSQL_VERSION}"获取5.6
ENV MYSQL_VERSION 5.6
- RUN && CMD && ENTRYPOINT
RUN:执行命令且创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数,如果docker run指定了其他命令,CMD命令被忽略如docker run -it centos /bin/bash,定义了多个CMD只会执行最后一个
ENTRYPOINT:设置容器启动时运行的命令,让容器以应用程序的行程运行,一定会执行
镜像发布
Docker Hub
# 输入账号密码登陆
docker login
docker push xxx/test:latest
私有Registry官方地址
# 另外一台服务器上安装docker后执行
docker run -d -p 5000:5000 --restart always --name registry registry:2
# 构建image
docker build -t ip:5000/hello-world .
# 安全
cd /etc/docker/
# 内容{"insecure-registries":["ip:5000"]}
vim daemon.json
sudo vim /lib/systemd/system/docker.service
# 重启docker
sudo service docker restart
docker.service加一行

Docker Network
- none:容器无法与外界通信
- host:容器和虚拟机共享Network,有端口冲突风险
- bridge:容器和虚拟机通过连接一一对应(docker0<->vethXXXX)
ping && telnet
- ping :验证IP的可达性
- telnet:验证服务的可达性
- ping测试,Wireshark抓取

Linux Network Namespace

# 启动两个容器
docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"
docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"
# 查询docker网络
docker network ls
# 新建bridge
docker network create -d bridge my-bridge
# docker run指定bridge,连接my-bridge的容器自动link好了,一个容器可以同时连接多个bridge,但是不互通除非同时在。
--network my-bridge
# docker run指定link,可以通过test2:80这样的方式访问,类似dns解析
--link test2
# 连接bridge
docker network connect my-bridge test2
# 端口映射
-p 80:80
虚拟机网络情况




多容器通信
todo
docker overlay & etcd
持久化存储和数据共享
方案一:基于本地文件系统的Volume
可以在执行Docker create/Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能是基于本地文件系统的volume管理
方案二:基于plugin的Volume
支持第三方存储方案,例如aws等云厂商
Volume类型
- 受管理的data Volume,又docker后台自动创建
- 绑定挂载的Volume,具体挂载位置可以由用户指定
Mysql案例
- Data Volume
# mysql
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 查看日志
docker logs mysql1
# 查看volume
docker volume ls
# 进入mysql容器
docker exec -it mysql1 /bin/bash
# 添加database
mysql -u root
create database docker;
show databases;
# 停止和删除容器
docker rm -f mysql1
# 重新创建容器用上一个volume,发现docker还在
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 删除volume
docker volume rm id
- Bind Mouting
# 当前目录下的index.html和容器内/usr/share/nginx/html的index.html同步,修改外面的=修改容器内部的
docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html --name test nginx
Docker Compose
Docker Compose是一个通过yml文件可以同时创建/管理多个容器的工具。 官方地址
- 安装
# 通过官方的方法太慢,这里通过python-pip安装
sudo yum -y install epel-release
sudo yum install python-pip
sudo pip install --upgrade pip
sudo pip --default-timeout=200 install -U docker-compose
docker-compose --version
- yml
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
# 运行(默认名称docker-compose.yml可以不指定)
docker-compose -f docker-compose.yml up -d
# 启动
docker-compose start
# 查看Image
docker-compose images
# 进入容器
docker-compose exec mysql bash
# 停止
docker-compose stop
# 停止容器服务且删除容器
docker-compose down
# 水平拓展(先启动一台test再执行)
docker-compose --scale test=3 -d