Docker基础
Docker简介及安装
概念
Docker是一个开源的应用容器引擎=应用+环境+包
安装Docker
注意CentOS版本过低需要按照官方推荐配置升级Linux内核!
# yum 包更新 yum update # 安装需要的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装docker yum install -y docker-ce # 查看docker版本 docker -v
Docker架构
镜像:相当于是一个root文件系统
容器:镜像和容器的关系,就相当于面向对象中类和对象的关系
仓库:代码控制中心,用来保存镜像
docker镜像加速
腾讯云、阿里云登录账号,每个人都有自己的加速地址,复制自己的加速地址后在终端输入下面指令
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://eob5atc6.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ###上面操作完成后输入下面代码测试是否成功 cat /etc/docker/daemon.json
Docker命令
进程命令
启动docker服务
systemctl start docker
停止docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
查看docker服务状态
systemctl status docker
开机启动docker服务
systemctl enable docker
镜像命令
查看本地镜像
docker images
搜索镜像
docker search redis
下载镜像
docker pull redis #不写版本号,默认最新版 docker pull redis:5.0
删除镜像
docker rmi [image id] docker rmi redis:latest docker images -q #查看所有id docker rmi `docker images -q` #删除所有镜像
容器命令
通过镜像创建容器,镜像运行出来的实例
创建容器
docker run -it --name=c1 centos:7 /bin/bash # i 表示容器保持一直运行 t 给容器分配终端可以接受命令 --name 起名 选定版本 进入容器初始化指令 # exit 退出容器同时关闭容器 docker run -id --name=c2 centos:7 # -d后台运行容器 exit不会关闭容器
查看容器
docker ps #查看正在运行容器 docker ps -a #查看历史容器
进入容器
docker exec -it c2 /bin/bash # -t分配终端
启动容器
docker start c2
停止容器
docker stop c2
删除容器
docker rm c1 docker rm `docker ps -aq` #删除所有容器,开启的容器不能被删除
查看容器信息
docker inspect c2
Docker容器的数据卷
数据卷
数据卷是宿主机中的一个目录或文件
当容器目录和数据卷目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
数据卷的作用
Docker容器删除后,数据卷的数据也不会随之销毁
Docker容器和外部机器直接交换文件
容器之间的数据交互
配置数据卷
启动容器时,使用-v参数设置数据卷
docker run ... -v #宿主机目录(文件):容器内目录(文件)... # 目录必须是绝对路径 # 如果目录不存在会自动创建 # 可以挂载多个数据卷 # 容器本身里面就是一个目录
#举栗 以/root/data为数据卷,将一个数据卷挂载到两个容器上 docker run -it --name=c3 -v ~/data:/root/data centos:7 docker run -it --name=c4 -v ~/data:/root/data centos:7
数据卷容器
多容器进行数据交换
多个容器挂载同一个数据卷
数据卷容器
将数据卷挂载到c3容器,c3容器挂载到其他两个容器使得两个容器能互相通信,即使容器c3挂了,不影响c1和c2通信
# 创建启动c3数据卷容器 docker run -it --name=c3 -v /volume centos:7 /bin/bash # 创建启动c1 c2容器,使用--volumes-from 参数 设置数据卷 docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
Docker部署实例
Docker部署MySQL
搜索mysql镜像
拉去mysql镜像
创建容器
操作容器中的mysql
通过端口映射,解决外部机器与容器的通信问题
需求
在Docker 容器中部署MySQL,并通过外部MySQL 客户端操作MySQL Server
案例:实现
搜索mysql镜像
拉取mysql镜像
创建容器
操作容器中的mysql
问题及解决方案
容器内的网络服务和外部机器不能直接通信
外部机器和宿主机可以直接通信
宿主机和容器可以直接通信
当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务
这种操作称为:端口映射
部署MySQL
搜索mysql镜像
docker search mysql
拉取mysql镜像
docker pull mysql:5.6
创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysql
docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
参数说明
-p 3307:3306
:将容器的3306端口映射到宿主机的3307端口--v $PWD/conf:/etc/mysql/conf.d
:将主机当前目录下的conf/my.cnf
挂载到容器/etc/mysql/my.cnf
配置目录-v $PWD/logs:/logs
:将主机当前目录下的logs
目录挂载到容器的/logs
目录日志-v $PWD/data:/var/lib/mysql
:将主机当前目录下的data
目录挂载到容器的/var/lib/mysql
数据目录-e MYSQL_ROOT_PASSWORD=123456
:初始化root 用户密码
使用外部机器访问MySQL
Docker部署tomcat
搜索Tomcat 镜像
docker search tomcat
拉取mysql镜像
docker pull tomcat
创建容器,设置端口映射、目录映射
#在/root目录下创建tomcat目录用于存放tomcat数据信息 mkdir ~/tomcat cd ~/tomcat
docker run -id --name=c_tomcat \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ tomcat
参数说明:
-p 8080:8080
:将容器的8080端口映射到主机的8080端口-v $PWD:/usr/local/tomcat/webapps
:将主机中当前目录挂载到容器的webapps
最后使用外部机器访问tomcat
Docker部署Nginx
注意在挂载前先将nginx的配置文件准备好
搜索Nginx 镜像
docker search nginx
拉取mysql镜像
docker pull nginx
创建容器,设置端口映射、目录映射
#在/root目录下创建nginx目录用于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf #在~/nginx/conf/下创建nginx.conf文件,粘贴下面代码块的内容 vim nginx.conf
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; }
docker -run -id --name=c_nginx \ -p 80:800 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx
参数说明:
-p 80:800
:将容器的80端口映射到宿主机的80端口-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf
:将主机当前目录下的/conf/nginx.conf
挂载到容器的:/etc/nginx/nginx.conf
配置目录-v $PWD/html:/usr/share/nginx/html
:将主机当前目录挂载到容器的/val/log/nginx
日志目录
使用外部机器访问nginx
Docker部署Redis
搜索Redis 镜像
docker search redis
拉取Redis 镜像
docker pull redis:5.0
创建容器,设置端口映射、目录映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
使用外部机器连接redis
redis-cli.exe -h 192.168.187.129 -p 6379
DockerFile
思考:
Docker镜像的本质是什么?
Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
Linux文件系统由bootfs和rootfs两部分构成
bootfs:包含bootloader(引导加载程序)和kernel(内核)
rootfs:root文件系统,包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
Docker镜像原理:
Docker镜像是由特殊的文件系统叠加而成
最低端是bootfs,并使用宿主机的bootfs
第二层root文件系统rootfs,称为base image
然后再往上可以叠加其他的镜像文件
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
制作镜像
容器转镜像
docker commit 容器id 镜像名称:版本号
镜像转压缩文件
docker save -o 压缩文件名称 镜像名称:版本号 # 注意容器中自己添加的文件会保存在镜像中,但是挂载的文件则不会
还原压缩文件为镜像
docker load -i 压缩文件名称
DockerFile
DockerFile是一个文本文件
包含一条条指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过DockerFile文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用无缝移植
案例一
自定义centos7镜像
默认登陆路径为/usr
可以使用vim
步骤
定义父镜像:FROM centos:7
定义作者信息:MAINTAINER itheima itheima@itcast.cn
执行安装vim命令:RUN yum install -y vim
定义默认的工作目录:WORKDIR /usr
定义容器启动执行命令:CMD /bin/bash
mkdir docker-files vim centos_dockerfile
FROM centos:7 MAINTAIER itheima <itheima@itcast.cn> RUN yum install -y vim WORKDIR /usr cmd /bin/bash # 每一行构建一层
docker build -f ./centos_dockerfile -t itheima_centos:1 .
案例二
定义DockerFile发布SpringBoot项目
定义父镜像:FROM java:8
定义作者信息:MAINTAINER itheima itheima@itcast.cn
将jar包添加到容器:ADD springboot.jar app.jar
定义容器启动执行的命令:CMD java -jar app.jar
通过dockerfile构建镜像:docker build -f dockerfile 文件路径 -t 镜像名称:版本
docker run -id -p 9000:8080 app #在容器启动时进行端口映射
Docker服务编排
微服务构架的应用系统中一般包含多个微服务,每个微服务一般都会部署多个实例,每个微服务都要手动启停,维护的工作量会很大。
服务编排:按照一定的业务规则批量管理容器
Docker Compose
编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务的构建,启动和停止。
利用Dockerfile定义运行环境镜像
使用docker-compose.yml定义组成应用的各服务
运行docker-compose up启动应用
Docker Compose安装
#Compose 目前已经完全支持Linux、MAC OS、Windows,在安装Compose之前,需要先安装Docker。下面以编译好的二进制包方式安装在Linux中 curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-'uname -s'-'uname -m' -o /usr/local/bin/docker-compose #设置文件可执行权限 chmod +x /usr/local/bin/docker-compose #查看版本信息 docker-compose -version
Docker Compose卸载
#二进制包方式安装的,删除二进制文件即可 rm /usr/local/bin/docker-compose
案例
使用docker compose编排nginx+springboot项目
创建docker-compose目录
mkdir ~/docker-compose cd ~/docker-compose
编写
docker-compose.yml
文件version: '3' services: nginx: iamge: nginx ports: - 80:80 links: - app volumes: - ./nginx/conf.d:/etc/nginx/conf.d # conf.d文件夹中创建后缀名为.conf文件 app: image: app expose: - "8080"
创建
./nginx/conf.d
目录mkdir -p ./nginx/conf.d
在
./nginx/conf.d
目录下编写crisp.conf
文件server { listen 80; acess_log off; location / { proxy_pass https://app:8080; } }
在
~/docker-compose
目录下 使用dockers-compose 启动容器docker-compose up
测试访问
http://192.168.187.129/hello
Docker 私有仓库
搭建私有仓库
Docker 官方的Docker hub是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
私有仓库搭建
拉取私有仓库镜像
docker pull registry
启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
打开浏览器,输入地址
https://私有仓库服务器ip:5000/v2/_catalog
看到{"repositories":[]}
表示私有仓库搭建成功修改
deamon.json
vim /etc/docker/daemon.json #在上述文件中添加一个key,保存退出。 #此步用于让docker信任私有仓库地址 #注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip {"insecure-registries": ["私有仓库服务器ip:5000"]}
重启docker 服务
systemctl restart docker docker start registry
上传镜像到私有仓库
标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
上传标记的镜像
docker push 私有仓库服务器ip:5000/centos:7
从私有仓库拉取镜像
#拉取镜像 docker pull 私有仓库服务器ip:5000/centos:7
Docker 相关概念
Docker容器虚拟化 与 传统虚拟机比较
容器就是将软件打包成标准化单元,以用于开发、交付和部署
容器镜像是轻量级的、可执行的独立软件包,包含软件运行所需要的所有内容:代码、运行时环境、系统工具、系统库和设置
容器化软件在任何环境中都能够始终如一地运行
容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突
相同:
容器和虚拟机具有相似的资源隔离和分配优势
不同:
容器虚拟化的是操作系统,虚拟机虚拟化的时硬件
传统的虚拟机可以运行不同的操作系统,容器只能运行同一类型的操作系统
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
性能 | 接近原生 | 弱于 |
系统支持两 | 单机支持上千个容器 | 一般几十个 |