Docker
一、概述
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从
Apache2.0
协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
Docker 从 17.03 版本之后分为
CE
(Community Edition: 社区版) 和EE
(Enterprise Edition: 企业版)
1.容器与虚拟化区别
容器技术是一种轻量级虚拟化技术
①轻量,与宿主机共享操作系统,直接使用宿主机的内核
②部署快,容器镜像相对于虚拟机镜像小,部署速度非常快,可以在几秒内完成部署
③移植性好,Build once, Run anywhere
④资源利用率高,相对于虚拟机,不需要安装操作系统,所有减少了很多CPU与内存消耗
2. Docker用到的内核技术
Docker容器本质上是宿主机的进程
Docker通过
NameSpace
实现资源隔离Docker通过
Cgroups
实现资源限制
3.存储驱动
写时复制与用时分配
Docker 通过写时复制
cow
(Copy-on-write)与用时分配(Allocate-on-demand)技术来提高存储的利用率
- 写时复制
该技术可以让多个容器共享同一个镜像的文件系统,所有数据从镜像中读取
只有当要对文件进行修改时,才从镜像里把要写的文件复制到自己的文件系统进行修改,所有的写操作都是这样,并不会修改镜像的源文件
多个容器操作同一个文件,会在每个容器的文件系统里生成一个副本,每个容器修改的都是自己的副本
- 用时分配
按需分配空间,用多少分配多少,使用时才分配
联合文件系统
UnionFS,把不同物理位置的目录合并mount到同一个目录中
用来实现写时复制与用时分配
- aufs
- overlay
二、Docker 安装
配置yum
源
#(1)CentOs源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#(2)Docke 源
#源一:Docker官方源
wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#源二:Docerk阿里源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装
yum install docker-ce -y
启动
systemctl start docker
systemctl enable docker
#查看版本
docker -v
docker version
#查看信息
docker info
跨主机访问
当需要在另一台机器远程访问时,需要配置
docker daemon 管理
#第一步:关闭服务
systemctl stop docker
#第二步:
vim /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}
#第三步:
vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#删除 -H fd://.....
[Service]
ExecStart=/usr/bin/dockerd
#第四步:
systemctl daemon-reload
#第五步:
systemctl start docker
ss -naltp | grep :2375
#第六步:远程主机访问
docker -H 容器宿主机IP version
三、镜像、容器、仓库
- 镜像
镜像就是打包好的环境与应用
镜像分类: 操作系统、应用程序
- 容器
容器就是镜像运行的实例
- 仓库
用于存放镜像
四、镜像相关命令
#1.查看本地镜像
docker images
#2.搜索镜像
docker search centos
#3.拉取镜像
docker pull busybox
#4.推送镜像
docker push 镜像名
#5.删除镜像
docker rmi imagename:tag
docker rmi imageid
#6.打tag
docker tag busybox:latest tigerup/test:v1
#7.镜像导出
docker save busybox -o /tmp/busybox.tar.gz
#8.镜像导入
docker load < /tmp/busybox.tar.gz
docker load -i /tmp/busybox.tar.gz
创建镜像
从容器创建一个新的镜像
docker commit a404c6c174a2 my_mysql:v1
五、容器相关命令
基本操作
#1.查看所有容器
docker ps -a
#2.运行容器
#latest是默认的TAG标签,可以省略;
docker run centos:latest echo test
docker run hello-world
#3.后台运行
docker run -d centos /bin/bash -c "while true; do echo test;sleep 3;done"
#4.查看控制台输出
docker logs ID/NAMES
#5.停止与开始容器
docker stop ID/NAMES
docker start ID/NAMES
docker restart ID/NAMES
#6.查看容器属性信息
docker inspect ID/NAMES
删除
#删除容器
docker rm ID
#移除不使用的数据
docker system prune
#停止所有容器
docker stop $(docker ps -aq)
#删除所有容器
docker rm $(docker ps -aq)
交互式操作
#交互式操作,运行在前台
docker run -i -t --name=test01 centos:latest /bin/bash
#退出交互
#Ctrl + P + Q
#连接容器
docker attach ID/NAMES
exec
docker exec c1 touch /root/123
docker exec c1 ls -l /root/123
#交互式操作
docker exec -it c1 /bin/bash
六、镜像使用
docker run
相关参数
#交互式运行
-it
#后台运行
-d
#指定端口映射
-p
#指定挂载卷
-v
#指定环境变量
-e
#指定重启规则
--restart
httpd
docker run -it -d -p 80:80 --name httpd1 -v /dockermount/www/:/usr/local/apache2/htdocs/ httpd
mariadb
docker run -d -p 3306:3306 --name mariadb1 -v /dockermount/mysql/data:/var/lib/mysql --restart=always -e MYSQL_ROOT_PASSWORD=123 mariadb:latest
nginx
#第一步:创建配置文件
vim /dockermount/nginx/etc/nginx.conf
#第二步:创建测试文件
echo "test" > /dockermount/nginx/html/index.html
#第三步:运行容器
docker run -d -p 8001:80 --restart=always --name=nginx1 -v /dockermount/nginx/html:/usr/share/nginx/html -v /dockermount/nginx/etc/nginx.conf:/etc/nginx/nginx.conf -v /dockermount/nginx/log:/var/log/nginx nginx:latest
tomcat
docker run -d -p 8080:8080 -v /data/tomcat_data:/usr/local/tomcat/webapps/ROOT --name=tomcat1 tomcat:latest
七、Web管理平台
- DockerUI
#下载镜像
docker pull uifd/ui-for-docker
#启动容器
docker run -d --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker
#
- Portainer
#下载镜像
docker pull portainer/portainer
#启动容器
docker run -d -p 9001:9000 --name=portainer -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
其他
1.解决时间不一致
由于下载官方镜像的时区与我们所在时区不一致,所以需要解决时间问题,以确保时间一致性
#方式一:宿主机操作
docker exec -it http1 /bin/bash
docker cp -L /etc/localtime http1:/etc/localtime
#方式二:容器中操作
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.开启路由转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
One comment