早些年使用Redmine、Jenkins,安装是一个非常麻烦的工作,更别说Oracle等大应用安装,后来找到简便安装方式,bitnami 网站把各类应用封装在一个安装包中,是软件安装非常便捷,随后Docker的出现,让人们开始了解容器,随之而来的容器编排k8s。
刚接触电脑时候,我们会安装不同的操作系统,一台电脑如何才能安装多个操作系统,vmware是非常好用的虚拟机软件,在软件部署过程中实体机不够,可以通过VM标准化实施部署流程。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC) 等技术。
在 LXC 的基础上 Docker 进行了进一步的封装, 让用户不需要去关心容器的管理, 使得操作更为简便。 用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker基本概念
镜像 可以用来创建Docker容器。
容器 从镜像创建的运行实例。
仓库 集中存放镜像文件的场所。
安装
yum install -y docker-ce
systemctl start docker
chkconfig docker on
#卸载docker
yum remove docker docker-common docker-selinux docker-engine -y
#安装yum
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce -y
基本命令
#拖取镜像
docker pull
#查看镜像
docker images
#载入镜像
docker load
#移除本地镜像
docker rmi
#命令来修改镜像的标签
docker tag
#创建运行
docker run --name mysql_db -p 3307:3306 -v /home/docker/mysql/logs:/data/logs/mysql -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/conf/:/etc/mysql/conf.d -e MYSQL_DATABASE=opencart -e MYSQL_ROOT_PASSWORD=123456 -d mysql
#-v:冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径
#--name:自定义容器名,不指定时,docker 会自动生成一个名称
#-d:表示后台运行容器 容器启动后会进入后台。某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或 nsenter 工具等。
#-p:表示进行服务器与 Docker 容器的端口映射,默认情况下容器中镜像占用的端口是 Docker 容器中的端口与外界是隔绝的,必须进行端口映射才能访问
#-e:传递环境变量
#镜像进程
docker ps -a
#启动关闭容器
docker stop mysql_db
docker start mysql_db
#容器日志
docker logs mysql_db
#交互可以进入容器,exec 也可以在宿主机对容器执行命令
docker exec -it mysql_db /bin/bash
#导入容器快照
docker import URL
#删除容器
docker rm dockerName
#容器ID或容器名称强制停止容器
docker kill
#仓库搜索
docker search centos
#容器ID或容器名称查看容器内运行的进程
docker top
#容器ID或容器名称查看容器内部细节
docker inspect
#容器ID进到容器内
docker attach
#容器ID:容器内的文件路径 宿主机路径从容器内拷贝文件到宿主机.
docker cp
如:docker cp f9e29e8455a5:/tmp/yum.log /root
docker logs [OPTIONS] CONTAINER OPTIONS说明:
- -f : 跟踪日志输出
- --since :显示某个开始时间的所有日志
- -t : 显示时间戳
- --tail :仅列出最新N条容器日志
docker logs --tail=1000 容器名称
Dockerfile 创建镜像
Dockerfile命令组成部分
部分 | 命令 |
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
创建Docker私有仓库
#拉取镜像
docker pull registry
#创建私有仓库
docker run -d -v /data/docker/registory:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest
#拉取镜像
docker pull mysql
#将mysql重新tag,注意:"/"前边是你的仓库所在服务器的ip+映射的端口
docker tag mysql:latest 172.18.11.126:5000/mysqltest:latest
#将其推送到私有仓库
docker push 172.18.11.126:5000/mysqltest:latest
#测试
#删除本地镜像
docker rmi 172.18.11.126:5000/mysqltest:latest
docker pull 172.18.11.126:5000/mysqltest:latest
push过程报错
Get https://172.18.11.126:5000/v2/: http: server gave HTTP response to HTTPS client
vi /etc/docker/daemon.json //如果没有此文件,请创建,格式必须正确,否则无法启动服务
{
"registry-mirrors": [ "https://pee6w651.mirror.aliyuncs.com"],
"insecure-registries":["172.18.11.126:5000"]
}
重启Docker
systemctl daemon-reload
systemctl restart docker
查看私有仓库
curl http://172.18.11.126:5000/v2/_catalog
获取某个镜像的标签列表
curl http://172.18.11.126:5000/v2/[image_name]/tags/list
registry开启删除
#查看默认配置
docker exec -it registry sh -c 'cat /etc/docker/registry/config.yml'
#开启删除(添加 delete: enabled: true)
docker exec -it registry sh -c "sed -i '/storage:/a\ delete:' /etc/docker/registry/config.yml"
docker exec -it registry sh -c "sed -i '/delete:/a\ enabled: true' /etc/docker/registry/config.yml"
#重启
docker restart registry
查询、删除镜像
#查询镜像
curl <仓库地址>/v2/_catalog
#查询镜像tag(版本)
curl <仓库地址>/v2/<镜像名>/tags/list
#删除镜像API
curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"
#获取镜像digest_hash
curl <仓库地址>/v2/<镜像名>/manifests/<tag> \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json"
Docker 数据卷管理
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:ro
#ro 只读
#创建卷
docker volume create portainer_data
#共享卷
docker run -d --name db3 --volumes-from db1 training/postgres
#备份
docker run --volumes-from mysql_db -v $(pwd):/backup mysql tar cvf /backup/backup.tar /var/lib/mysql
#恢复
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态
Docker网络管理
外部访问容器
使用-p则需要指定对应的主机的端口应该到容器中的端口。支持的格式
IP:hostPort:containerPort | IP::containerPort | hostPort:containerPort
docker run --name mysql_db -p 3307:3306 -v /home/docker/mysql/logs:/data/logs/mysql -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/conf/:/etc/mysql/conf.d -e MYSQL_DATABASE=opencart -e MYSQL_ROOT_PASSWORD=123456 -d mysql
#查看网络链路 iptables -t nat -nvL
查看网桥 brctl show
查看网络模式: docker network ls
查看所有网卡:ip addr
查看网络路由:route -n
tcpdum 抓包:
物理网卡:tcpdump -i ens33 -n -vvv tcp port 8000
docker0:tcpdump -i docker0 -n -vvv tcp port 8000
容器访问外网
配置容器DNS和主机名
配置主机名可以通过docker run
的时候使用-h hostname指定主机名。
编辑/etc/docker/daemon.json
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
容器互联
link 方式互联
docker run -d -P --name web --link db:alias_name training/webapp python app.py
容器之间相互通讯可以通过docker run
中的--link=container_name:alias
参数来达到效果。
此种方式可以很方便让容器使用容器名进行通讯,而不需要依赖IP地址,不过link
方式仅仅解决了单机容器间的互联。
自定义网桥的方式进行互联
#创建命令
docker network create --driver bridge zg_net
#检视创建的网络信息
docker network inspect zg_net
#查看docker的网络
docker network ls
#2个容器公用一个网络
docker run -it -d --name centos1 --network zg_net centos
docker run -it -d --name centos2 --network zg_net centos
Docker Compose
Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
管理工具
progrium/consul
Docker 可视化工具 portainer/portainer