Docker介绍
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低
Docker应用场景
Web 应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他的后台应用
Docker结构
Docker 镜像(Images)
:Docker 镜像是用于创建 Docker 容器的模板,镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来
Docker 容器(Container)
:容器是独立运行的一个或一组应用。镜像相当于类,容器相当于类的实例
Docker 客户端(Client)
:Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信
Docker 主机(Host)
: 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器
Docker守护进程
: Docker服务器端进程,负责支撑Docker 容器的运行以及镜像的管理
Docker仓库
:DockerHub (Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库
Docker Hub提供了庞大的镜像集合供使用。用户也可以将自己本地的镜像推送到Docker仓库供其他人下载
Docker安装与操作
安装过程
1 2 3 4 5 6 7 8 9 10 11
| sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
docker -v
|
配置镜像
1 2 3
| mkdir /etc/docker vi /etc/docker/daemon.json
|
1 2 3
| { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
|
Docker启动与停止指令
1 2 3 4 5 6 7 8 9 10
| systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker
|
Docker操作镜像指令
REPOSITORY
:镜像名称
TAG
:镜像标签
IMAGE ID
:镜像ID
CREATED
:镜像的创建日期
SIZE
:镜像大小
NAME
:镜像名称
DESCRIPTION
:镜像描述
STARS
:用户评价,反应一个镜像的受欢迎程度
OFFICIAL
:是否官方
AUTOMATED
:自动构建,表示该镜像由Docker Hub自动构建流程创建的
1 2 3 4
| docker pull 镜像名称
docker pull centos:7
|
1 2 3 4 5
| docker rmi 镜像id
docker rmi docker images -q
|
Docker操作容器指令
1 2 3 4
| 查看正在运行的容器使用命令: docker ps 查看所有容器使用命令: docker ps -a
|
创建容器
启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态
1 2 3 4
| docker pull centos:7
docker run -it --name=xiaobocentos1 centos:7 /bin/bash
|
启动完成后长期运行,不直接进入容器
1 2 3 4
| docker run -di --name=ydlcentos2 centos:7
docker exec -it xiaobocentos2 /bin/bash
|
停止并启动容器
1 2 3 4
| docker stop xiaobocentos2
docker start xiaobocentos2
|
文件拷贝
宿主机拷贝到容器
1 2 3 4 5 6 7 8 9 10 11 12 13
|
touch xiaobo.txt
docker cp xiaobo.txt xiaobocentos2:/root
docker exec -it xiaobocentos2 /bin/bash
ll
|
容器拷贝到宿主机
1 2 3 4 5 6 7 8 9 10
|
touch xiaobo.log
exit
docker cp xiaobocentos2:/root/xiaobo.log /root
|
目录挂载
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而同步容器
创建容器时添加-v参数
1 2 3 4 5 6 7 8 9 10 11 12 13
| mkdir /root/binlog
docker run -di -v /root/binding:/root/binding --name=xiaobocentos3 centos:7
touch /root/binding/xiaobo.log
ll /root/binding
|
如果是多级的目录,可能现权限不足,需要添加参数--privileged=true
解决挂载的目录没有权限的问题
查看容器ip
1 2
| docker inspect xiaobocentos3
|
容器中有一个局域网,宿主机有一个ip,所以外部访问需要通过宿主机端口代理
删除容器
1 2
| docker rm xiaobocentos3
|
部署软件
Mysql容器部署
1 2 3
| mkdir /root/mysql cd /root/mysql
|
1 2 3 4 5 6 7 8
| docker run -id \ -p 3307:3306 \ --name=xiaobo_mysql \ -v /root/mysql/conf:/etc/mysql/conf.d \ -v /root/mysql/logs:/logs \ -v /root/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=xiaobo \ mysql:8.0
|
-p 3307:3306
将容器的 3306 端口映射到宿主机的 3307 端口
-v /root/mysql/conf:/etc/mysql/conf.d \
将主机当前目录下的my.cnf 挂载到容器
-v /root/mysql/logs:/logs \
将主机当前目录下的 logs 目录挂载到容器的 /logs 日志目录
-v /root/mysql/data:/var/lib/mysql \
将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 数据目录
-e MYSQL_ROOT_PASSWORD=xiaobo \
初始化 root 用户的密码
1
| docker exec -it xiaobo_mysql /bin/bash
|
Tomcat部署
1 2 3
| mkdir /root/tomcat cd /root/tomcat
|
1 2 3 4
| docker run -id --name=xiaobo_tomcat \ -p 8081:8080 \ -v /root/tomcat:/usr/local/tomcat/webapps \ tomcat
|
Nginx部署
1 2 3 4 5 6 7
| mkdir /root/nginx cd /root/nginx mkdir conf cd conf
vim nginx.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| user nginx; worker_processes 1;
error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
events { worker_connections 1024; }
http { include /etc/nginx/mime.types; default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on; #tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf; }
|
1 2 3 4 5 6
| docker run -id --name=xiaobo_nginx \ -p 80:80 \ -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /root/nginx/logs:/var/log/nginx \ -v /root/nginx/html:/usr/share/nginx/html \ nginx
|
redis部署
1
| docker run -id --name=xiaobo_redis -p 6380:6379 redis:5.0
|
1
| redis-cli.exe -h 192.168.117.200 -p 6380
|
docker-compose
ompose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。使用compose,通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有服务
安装
1 2 3 4 5 6 7
| curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -version
|
卸载
1 2
| rm /usr/local/bin/docker-compose
|
常用命令官网查看即可
compose模板
1 2 3 4 5 6 7 8
| version: "2" services: web: images: nginx ports: -"8080:80" volumes: - /usr/local/abc:/usr/local/cba
|
服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等
数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用
应用的网络,在它下面可以定义应用的名字、使用的网络类型等等
compose应用
1 2 3 4 5 6
| mkdir -p /usr/local/mycompose
cd /usr/local/mycompose
vi docker-compose.yml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| version: '3' services: redis1: image: redis ports: - "6379:6379" container_name: "redis1" networks: - dev mysql1: image: centos/mysql-57-centos7 environment: MYSQL_ROOT_PASSWORD: "root" ports: - "3306:3306" container_name: "mysql1" networks: - dev web1: image: tomcat ports: - "9090:8080" container_name: "web1" networks: - dev - pro networks: dev: driver: bridge pro: driver: bridge
|
仓库的迁移和备份
迁移备份
1 2
| docker commit 容器名称 镜像名称
|
1
| docker save –o tar文件名 镜像名
|
1 2 3 4 5 6 7 8 9 10
| docker stop xiaobocentos1
docker rm xiaobocentos1
docker rmi xiaobocentos1
docker load -i xiaobocentos1.tar
docker run -di --name=xiaobocentos1 xiaobocentos1
|
Dockerfile
简单明了,创建镜像的
1 2 3 4 5 6 7 8
| mkdir –p /usr/local/dockerjdk8 cd /usr/local/dockerjdk8
vi Dockerfile
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| FROM centos:7 MAINTAINER ITLILS WORKDIR /usr RUN mkdir /usr/local/java ADD jdk-8u231-linux-x64.tar.gz /usr/local/java/ ENV JAVA_HOME /usr/local/java/jdk1.8.0_231 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
# 4、执行命令构建镜像;不要忘了后面的那个 . docker build -t='jdk1.8' .
# 5、查看镜像是否建立完成 docker images
|
1 2 3 4
| docker run -it --name=testjdk jdk1.8 /bin/bash
java -version
|
搭建私有仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker pull registry
docker run -id --name=registry -p 5000:5000 registry
vim /etc/docker/daemon.json
{"insecure-registries":["私有仓库服务器ip:5000"]}
systemctl restart docker docker start registry
|
1 2 3 4 5
| docker tag redis:5.0 192.168.117.200:5000/redis:5.0
docker push 192.168.117.200:5000/redis:5.0
|
其它服务器拉取私有仓库镜像
1 2 3 4 5 6 7 8 9
| vi /usr/lib/systemd/system/docker.service
--add-registry=ip地址:5000 --insecure-registry=ip地址:5000 \
systemctl daemon-reload systemctl restart docker
|
重启之后直接拉取即可
容器和虚拟机对比
相同
具有相似的资源隔离和分配优势
不同
容器虚拟化的是操作系统,虚拟机虚化的是硬件
虚拟机可以运行不同的操作系统,容器只能运行相同的操作系统
正确的开始 微小的长进 然后持续 嘿 我是小博 带你一起看我目之所及的世界……