Docker
Docker
Docker解决依赖兼容问题
采用了两个手段:
- 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免互相干扰
Docker解决操作系统环境差异
1.应用调用操作系统应用(函数库),实现各种功能
2.函数库是对内核指令集的封装,会调用内核指令
3.内核指令操作计算机硬件
Docker如何解决不同系统环境的问题?
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包,不管实际的运行系统是Centos还是Ubuntu都可以正常运行,因为应用程序调用的是捆绑在一起的系统的函数,系统函数再调用linux内核的函数。 Docker运行到不同操作系统时,直接基于打包的函数库,只借助于操作系统的Linux内核来运行,不在乎实际运行的系统版本是什么。
Docker是一个快速交付应用、运行应用的技术,具备下列优势:
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
运行时利用沙箱机制形成隔离容器,各个应用互不干扰
启动、移除都可以通过一行命令完成,方便快捷
Docker和虚拟机的差异:
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
Docker架构
镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
镜像就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
容器就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
DockerHub
- DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
- 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
Docker架构
Docker是一个CS架构的程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
CentOS安装Docker
Docker 分为 CE 和 EE 两大版本,CE 即社区版,分别为stable、test、nightly,stable是稳定版本,test是测试后的预发布版本,而nightly则是开发中准备在下一个版本正式发布的版本
EE 即企业版,强调安全,付费使用
1.1.卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
1.2.安装docker
安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入命令:
yum install -y docker-ce
1.3.启动docker
关闭防火墙
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后输入命令,可以查看docker版本:
docker -v
如图:
1.4.配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2.CentOS7安装DockerCompose
2.1.下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2.2.修改文件权限
修改文件权限:
# 修改权限
chmod +x /usr/local/bin/docker-compose
2.3.Base自动补全命令:
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
3.Docker镜像仓库
带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
docker命令
docker基础命令
1.启动docker
systemctl start docker
2.关闭docker
systemctl stop docker
3.重启docker
systemctl restart docker
4.设置docker开机启动
systemctl enable docker
5.查看docker的运行状态
systemctl status docker
6.docker的帮助命令
docker --help
假如我们启动镜像的时候忘记命令的使用
docker run --help
docker镜像命令
1.查看docker镜像列表
docker images
2 .单独搜索镜像
docker images 镜像名
3.拉取镜像
不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名
docker pull 镜像名:tag
4.删除没有用的镜像
#删除一个
docker rmi -f 镜像名/镜像ID
#删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
强制删除
docker image rm 镜像名称/镜像ID
docker容器命令
1.查看正在运行的容器
docker ps
2.查看所有容器包括正在运行和停掉的容器
docker ps -a
3.运行一个容器
# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
4.访问容器
这里的5f39bcf1dbad是容器ID
docker exec -it 5f39bcf1dbad /bin/bash
5.删除容器 首先要停止运行的容器
# 先停止咱之前运行的 mysql5.7 容器
docker stop 容器名/容器ID
然后再进行查询所有容器
docker ps -a
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq
容器端口与服务器端口映射
-p 宿主机端口:容器端口
8080:8081解析 将容器内部的 8081端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8080端口 即可访问到 docker 容器 8081端口了
docker run -it -d --name mysql -p 8888:6379 mysql:5.7 /bin/bash
然后运行容器
exit 或者 ctrl+p+q
构建Docker镜像
docker build -t <镜像名称> <Dockerfile所在路径>
docker build -t my-image /path/to/Dockerfile
docke安装Nginx
1.创建目录
#mkdir -p /data/nginx/{conf.d,logs,html,conf}
其中
data/nginx/conf.d用来映射 include /etc/nginx/conf.d/*.conf 文件内容
/data/nginx/logs用来映射 日志
/data/nginx/html 用来映射 网站代码
/data/nginx/conf 用来映射 默认配置文件nginx.conf
2.启动一个测试容器
docker run --name nginx_ceshi -p 80:80 --privileged=true -d nginx
3.将测试容器的文件拷贝到目录
删除测试容器
#docker stop nginx_ceshi
#docker rm nginx_ceshi
4.启动容器
docker run --name nginx -p 80:80 -v /data/nginx/conf.d:/etc/nginx/conf.d -v /data/nginx/logs:/var/log/nginx -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf --privileged=true -d nginx