Docker基础学习
![Docker](https://img-blog.csdnimg.cn/23d044147bc34e5abb04d8a365885e98.png)
什么是容器?
传统物理服务器的部署的缺点
虚拟机的部署
虚拟机也是有局限性的,每一个虚拟机都是完整的操作系统,要分配系统资源,虚拟机太多的时候,宿主机的本身资源消耗。
KVM
了解Docker
docker是谷歌公司的Golang语言开发而来的,是居于Linux内核的Cgroups,NameSpace等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
由于隔离的进程独立于宿主机和其他隔离的进程,也称为容器。
综合上面的图,我们可以得到:
- 容器可以提供宿主机的性能,而kvm是分配宿主机的资源,性能弱
- 同样配置的宿主机,开启10个虚拟机的资源可以开启100个容器。
- kvm需要开机流程,比较耗时。容器几秒钟就搞定了。
- kvm需要硬件CPU的虚拟化支持,而容器不要。
Docker的基础组件
- image镜像:用来构建容器
- Container,容器(应用程序就是部署在这里)
- 镜像仓库(dockerhub)
Docker平台组成
Docker的安装
以Centos 7.9为例
# 准备
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
# yum包更新到最新(可选)
yum -y update
# 卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
# 安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 详细步奏
# 设置yum源(选择一个可用的就行)
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
# 查看可用版本
yum list docker-ce --showduplicates | sort -r
# 安装docker(选择稳定版本)
yum -y install docker-ce-版本号.ce
# 查看docker版本,验证是否成功
docker -v
# 开机自启
sudo systemctl start docker
sudo systemctl enable docker
第二步如果出现Peer’s Certificate has expired
能是系统时间的问题;于是就查询了一下当前系统的时间,用命令date
试一下。
同步时间:yum install -y ntp
ntpdate time.apple.com
![image-20230616160815880](https://daokun-hexo.oss-cn-hangzhou.aliyuncs.com/img_for_hexo/image-20230616160815880.png)
配置Docker镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://8jljbmiq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
Docker服务相关命令
systemctl daemon-reload //重载系统服务
systemctl list-unit-files --type service //查看全部服务命令
systemctl status docker // 查看docker服务状态
systemctl enable docker //设置docker开机自启动
systemctl disable docker // 关闭docker开机启动
systemctl start docker // 启动docker服务
systemctl stop docker // 停止docker服务
systemctl restart docker // 重启docker服务
Docker镜像相关命令
镜像的原理
总结:
- 当一个image启动容器时,docker在该image的最顶层,添加一个读写文件系统作为容器,然后运行该容器
- docker镜像的本质是基于UnionFS管理的分层文件系统。
- docker镜像为什么才几百兆?
答:因为docker镜像只提供rootfs和其他镜像层,共用宿主机的Linux内核(bootfs),因此很小
- 为什么下载docker的nginx镜像133MB?nginx安装包不是才几兆吗?
答:因为docker的nginx镜像是分层的,但是一个用于运行nginx的镜像文件,依赖于父进程和基础镜像(发行版)。通俗的说:这个是软件,依赖操作系统。
- 查看镜像(本地)
docker images
- 搜索镜像(远程)
docker serach XXX
例如:docker redis
- 拉取镜像(远程)
docker pull redis:[版本号]
不写版本号,默认是最新的
Docker Hub Container Image Library | App Containerization
- 删除镜像(本地)
docker rmi 镜像id
Docker容器相关命令
- 创建容器
docker run -it --name=test1 centos:版本
i代表持久,t代表有终端,退出就不运行
docker run -id --name=test2 centos:版本
退出会运行
docker run -it --name=test1 centos /bin/bash
-
退出容器
exit
-
查看容器
查看正在运行的容器: docker ps
查看容器信息:docker inspect 容器
查看所有的容器: docker ps -a
- 进入容器
docker exec -it test2(名字) /bin/bash
- 启动容器
docker start 容器名字
- 停止容器
docker stop 容器名字
- 删除容器
docker rm 容器名字/容器ID
Docker容器的数据卷
数据卷
是宿主机的一个目录或者文件
当容器目录和数据卷目录绑定之后,对方的修改会立即同步。
一个数据卷可以被多个容器目录绑定。一个容器也可以绑定多个数据卷。
所以得出数据卷的作用:
- 容器数据的持久保存
- 外部机器和容器的间接通信
- 容器之间的数据交换
配置数据卷
只需要在创建容器的时候,加入参数-v 宿主机目录:容器目录
docker run -v
目录必须是绝对路径
如果目录不在,会自动创建
例子:docker run -it --name=c1 -v /root/daokun:/daokun centos bash
数据卷容器
多容器进行数据交换:
- 多个容器挂载同一个数据卷
- 数据卷容器(专门存放数据的容器)
- 创建启动C3数据卷容器,使用-v 参数
命令: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 inspect 容器名字
docker应用部署
MySQL部署
需求;在docker部署MySQL,并且通过外部MySQL客户端操作MySQL sever
实现步奏:
- 搜索MySQL镜像
- 拉取MySQL镜像
- 创建容器
- 操作容器中的MySQL
外部机器不能和容器直接通信,但是外部机器可以和宿主机通信。
用容器端口映射到宿主机。
具体实现:
- 搜索镜像:
docker search mysql
- 拉取镜像:
docker pull mysql:5.6
- 创建容器,设置端口映射,目录映射
# 在/root下创建MySQL目录用于存储MySQL的数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=test_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=12345 \
mysql:5.6
说明:
-p 3307:3306
:将容器的3306映射到宿主机3307
--name=test_mysql
:设置名字
-v $PWD/conf:/etc/mysql/conf.d
:挂载配置目录
-v $PWD/logs:/logs
主机当前目录下的logs目录挂载到容器的logs
-v $PWD/data:/var/lib/mysql
:将数据目录挂载到容器
进入mysql容器:docker exec -it test_mysql /bin/bash
登录mysql:mysql -uroot -p123456
(安全期间,到p就回车)
tomcat部署
- 搜索镜像
docker search tomcat
- 拉取tomcat镜像
docker pull tomcat
- 创建容器,设置端口映射、目录映射
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=test_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
在浏览器输入我的宿主机IP地址
加上8080端口
创建test目录,创建index.html文件
<h1>hello daokun !</h1>
Nginx部署
- 搜索Nginx镜像
docker search Nginx
- 拉取redis镜像
docker pull Nginx
- 创建挂载目录
# 创建挂载目录
mkdir -p ~/nginx/conf
mkdir -p ~/nginx/log
mkdir -p ~/nginx/html
创建,并且把文件复制过来
# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf ~/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d ~/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html ~/nginx/
- 删除刚才的容器
# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx
# 删除正在运行的nginx容器
docker rm -f nginx
- 重新创建,然后设置端口映射
docker run -id --name=test_nginx \
-p 9001:80 \
-v ~/nginx/conf/conf.d:/etc/nginx/nginx.conf.d \
-v ~/nginx/log:/var/log/nginx \
-v ~/nginx/html:/usr/share/nginx/html \
nginx
Redis部署
- 搜索redis镜像
docker search redis
- 拉取redis镜像
docker pull redis:5.0
- 创建容器,设置端口映射
docker run -id --name=test_redis -p 6379:6379 redis:5.0
- 使用外部机器连接redis
./redis-cli.exe -h 192.168.31.87 -p 6369
Dockerfile
镜像制作
- 容器转换为镜像
docker commit 容器id 镜像名称:版本号
镜像再转换成压缩文件:docker save -o 压缩文件名称 镜像名称:版本号
解压:docker load -i 压缩文件名称
- dockerfile
Dockerfile的概念
- 是一个文本文件
- 包含一条条指令
- 每一条指令构建一层,基于基础镜像
镜像是多层存储的,每一层都在前一层的基础进行修改。
dockerfile的主要组成部分:
基础镜像信息 FROM centsos:7.9
制作镜像操作指令RUN yum install openssh-server -y
容器启动时执行命令CMD [“/bin/bash”]
dockerfile指令
FRO 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它(维护者信息,可以没有)
RUN 你想让它干嘛(命令前面加RUN就行)
ADD 给他一点创业资金(添加宿主机的文件到文件内,会自动解压)
COPY 和ADD一样,但是不会自动解压
WORKDIR 我是cd(设置当前工作目录)
VOLUME给它一个存放行李的地方
EXPOSE 它要打开的门是啥(指定对外端口)
CMD 奔跑吧,兄弟!(指定容器启动后要干的事情)
dockerfile实践1
需求:通过dockefile,构建nginx镜像,且运行容器后,生成的页面是"道坤刚入门docker"
- 创建Dockerfile文件,注意文件名,必须是这个
FROM nginx
RUN echo '<meta charset=utf8>道坤入门Docker' > /usr/share/nginx/html/index.html
-
当前目录执行
docker build .
-
查看镜像:
docker images
可以看到tag这一类都是空的。
我们可以进行修改docker tag 容器id 容器tag
实例:docker tag 011c7be2ab my-nginx
- 运行镜像
- 先查看有没有端口占用
netstat -tunlp
docker run -d -p 9003:80 my-nginx
(9003是宿主机的端口)
正确运行会返回一个id
最终结果
感谢: