官方地址
sudo yum remove docker / docker-client / docker-client-latest / docker-common / docker-latest / docker-latest-logrotate / docker-logrotate / docker-engine 复制代码
# 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 复制代码
sudo yum install docker-ce docker-ce-cli containerd.io 复制代码
sudo systemctl start docker 复制代码
sudo docker run hello-world 复制代码
todo
# Adding user vagrant to group docker sudo gpasswd -a vagrant docker sudo service docker restart 复制代码
exit vagrant ssh 复制代码
自己构建Base Image
#include<stdio.h> int main() { printf("hello docker/n"); } 复制代码
gcc -static hello.c -o hello 复制代码
# 制做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文件 # 使用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 复制代码
todo
# 制作Base Image FROM scratch # 使用Base Image FROM centos 复制代码
LABEL maintainer="xxx@qq.com" LABEL version="1.0" LABEL description="test" 复制代码
# &&联接两个命令,/换行,一个RUN一层,建议用&&写一起,避免无用分层 RUN yum update && yum install -y vim / python-dev 复制代码
# 不存在就创建 WORKDIR /test WORKDIR demo # 结果/test/demo,不要使用RUN cd,尽量使用绝对路径 RUN pwd 复制代码
# 相同:把文件拷贝到指定目录 # 不同:ADD如果拷贝压缩文件会自动解压,优先使用COPY ADD hello / COPY hello / # /root/test/hello WORKDIR /root ADD hello test/ 复制代码
# 定义常量,之后用"${MYSQL_VERSION}"获取5.6 ENV MYSQL_VERSION 5.6 复制代码
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加一行
打开地址http://ip:5000/v2/_catalog,查看是否已经push到registry
# 启动两个容器 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 复制代码
虚拟机网络情况
brctl show
docker inspect bridge
总体
docker overlay & etcd
可以在执行Docker create/Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能是基于本地文件系统的volume管理
支持第三方存储方案,例如aws等云厂商
Mysql的Dockerfile和安装指南
# 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 复制代码
# 当前目录下的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是一个通过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 复制代码
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 复制代码