Docker基础学习


Docker

什么是容器?

传统物理服务器的部署的缺点

image-20230616095224893

虚拟机的部署

image-20230616095516846

虚拟机也是有局限性的,每一个虚拟机都是完整的操作系统,要分配系统资源,虚拟机太多的时候,宿主机的本身资源消耗。

KVM

image-20230616101047380

了解Docker

docker是谷歌公司的Golang语言开发而来的,是居于Linux内核的Cgroups,NameSpace等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术

由于隔离的进程独立于宿主机和其他隔离的进程,也称为容器

image-20230616102003416

image-20230616102212501

综合上面的图,我们可以得到:

  1. 容器可以提供宿主机的性能,而kvm是分配宿主机的资源,性能弱
  2. 同样配置的宿主机,开启10个虚拟机的资源可以开启100个容器。
  3. kvm需要开机流程,比较耗时。容器几秒钟就搞定了。
  4. kvm需要硬件CPU的虚拟化支持,而容器不要。

Docker的基础组件

image-20230616102832901

  • image镜像:用来构建容器
  • Container,容器(应用程序就是部署在这里)
  • 镜像仓库(dockerhub)

Docker平台组成

image-20230616103058853

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

image-20230616154920866

能是系统时间的问题;于是就查询了一下当前系统的时间,用命令date试一下。

同步时间:yum install -y ntp

ntpdate time.apple.com

image-20230616160815880

配置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-20230616190735740

image-20230616192716418

image-20230616212055132

总结:

  • 当一个image启动容器时,docker在该image的最顶层,添加一个读写文件系统作为容器,然后运行该容器
  • docker镜像的本质是基于UnionFS管理的分层文件系统。
  • docker镜像为什么才几百兆?

答:因为docker镜像只提供rootfs和其他镜像层,共用宿主机的Linux内核(bootfs),因此很小

  • 为什么下载docker的nginx镜像133MB?nginx安装包不是才几兆吗?

答:因为docker的nginx镜像是分层的,但是一个用于运行nginx的镜像文件,依赖于父进程和基础镜像(发行版)。通俗的说:这个是软件,依赖操作系统。

  1. 查看镜像(本地)

docker images

  1. 搜索镜像(远程)

docker serach XXX

例如:docker redis

image-20230616162814793

  1. 拉取镜像(远程)

docker pull redis:[版本号]

不写版本号,默认是最新的

Docker Hub Container Image Library | App Containerization

  1. 删除镜像(本地)

docker rmi 镜像id

Docker容器相关命令

  1. 创建容器

docker run -it --name=test1 centos:版本i代表持久,t代表有终端,退出就不运行

docker run -id --name=test2 centos:版本退出会运行

docker run -it --name=test1 centos /bin/bash

image-20230616164608316

  1. 退出容器

    exit

  2. 查看容器

查看正在运行的容器: docker ps

查看容器信息:docker inspect 容器

查看所有的容器: docker ps -a

  1. 进入容器

docker exec -it test2(名字) /bin/bash

  1. 启动容器

docker start 容器名字

  1. 停止容器

docker stop 容器名字

  1. 删除容器

docker rm 容器名字/容器ID

Docker容器的数据卷

数据卷

是宿主机的一个目录或者文件

当容器目录和数据卷目录绑定之后,对方的修改会立即同步。

一个数据卷可以被多个容器目录绑定。一个容器也可以绑定多个数据卷。

所以得出数据卷的作用:

  • 容器数据的持久保存
  • 外部机器和容器的间接通信
  • 容器之间的数据交换

配置数据卷

只需要在创建容器的时候,加入参数-v 宿主机目录:容器目录

docker run -v

目录必须是绝对路径

如果目录不在,会自动创建

例子:docker run -it --name=c1 -v /root/daokun:/daokun centos bash

数据卷容器

多容器进行数据交换:

  • 多个容器挂载同一个数据卷
  • 数据卷容器(专门存放数据的容器)
  1. 创建启动C3数据卷容器,使用-v 参数

命令:docker run -it --name=c3 -v /volume centos:7 /bin/bash

  1. 创建启动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 容器名字

image-20230616195658761

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

image-20230616204214494

登录mysql:mysql -uroot -p123456(安全期间,到p就回车)

tomcat部署

  1. 搜索镜像

docker search tomcat

  1. 拉取tomcat镜像

docker pull tomcat

  1. 创建容器,设置端口映射、目录映射

mkdir ~/tomcat

cd ~/tomcat

docker run -id --name=test_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat

在浏览器输入我的宿主机IP地址

image-20230616210339854

加上8080端口

image-20230616210422057

创建test目录,创建index.html文件

<h1>hello daokun !</h1>

image-20230616211216969

Nginx部署

  1. 搜索Nginx镜像

docker search Nginx

  1. 拉取redis镜像

docker pull Nginx

  1. 创建挂载目录
# 创建挂载目录
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/
  1. 删除刚才的容器
# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx
 
# 删除正在运行的nginx容器
docker rm -f nginx
  1. 重新创建,然后设置端口映射
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

image-20230616215201113

Redis部署

  1. 搜索redis镜像

docker search redis

  1. 拉取redis镜像

docker pull redis:5.0

  1. 创建容器,设置端口映射

docker run -id --name=test_redis -p 6379:6379 redis:5.0

  1. 使用外部机器连接redis

./redis-cli.exe -h 192.168.31.87 -p 6369

Dockerfile

镜像制作

  1. 容器转换为镜像

docker commit 容器id 镜像名称:版本号

镜像再转换成压缩文件:docker save -o 压缩文件名称 镜像名称:版本号

解压:docker load -i 压缩文件名称

  1. 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"

  1. 创建Dockerfile文件,注意文件名,必须是这个
FROM nginx
RUN echo '<meta charset=utf8>道坤入门Docker' > /usr/share/nginx/html/index.html
  1. 当前目录执行docker build .

  2. 查看镜像:docker images

image-20230616231312299

可以看到tag这一类都是空的。

我们可以进行修改docker tag 容器id 容器tag

实例:docker tag 011c7be2ab my-nginx

image-20230616231649399

  1. 运行镜像
  • 先查看有没有端口占用netstat -tunlp

docker run -d -p 9003:80 my-nginx

(9003是宿主机的端口)

image-20230616231819387

正确运行会返回一个id

最终结果

image-20230616232116715

感谢:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值