Docker

Docker

安装Docker

docker安装

安装

帮助文档:

#1、卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#2、需要的安装包
yum install -y yum-utils
#3、设置镜像的仓库
#国外的地址
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  
    
# 设置阿里云的Docker镜像仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
#4、更新yum软件包索引
yum makecache fast
    
#5、安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io   # 安装社区版
yum install docker-ee docker-ee-cli containerd.io   # 安装企业版

#6、启动docker
systemctl start docker   # 启动Docker
docker version           # 查看当前版本号,是否启动成功
systemctl enable docker  # 设置开机自启动

#7、测试 hello-world
docker run hello-world

#8、查看一下下载的这个 hello-world 镜像
docker images

#9、卸载docker
yum remove docker-ce docker-ce-cli containerd.io  # 卸载依赖
rm -rf /var/lib/docker    # 删除资源  . /var/lib/docker是docker的默认工作路径

阿里云镜像加速

配置使用

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xm66mpjz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

回顾hello-world的执行流程

在这里插入图片描述

底层原理

Docker是怎么工作的?

Docker是一个Client-Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个指令。

在这里插入图片描述

Docker为什么比虚拟机快?

1、Docker有着比虚拟机更少的抽象层

2、Docker利用的是宿主机的内核,vm需要的是Guest OS。所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免一些引导性操作。虚拟机是加载Guest OS,分钟级操作,而Docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级的。

Docker的常用命令

帮助命令

docker version  #显示docker的版本信息
docker info   #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令

官方文档 https://docs.docker.com/reference/

镜像命令

查看镜像

docker images   #查看本地所有镜像信息
#可选项
  -a, --all             #列出所有的镜像
  -q, --quiet           #只显示镜像的ID

搜索镜像

docker search  #搜索镜像
eg:docker search mysql

下载镜像

docker pull #下载镜像
#docker pull 镜像名 [:tag] 下载镜像并指定版本,如果不写版本,默认就是最新版本
eg:docker pull mysql

删除镜像

#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  $(docker images -aq)

容器命令

说明:有了镜像之后才可以创建容器

下载一个centOS镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image

#参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d  后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p(小写)  指定容器的端口
	-p ip:主机端口
-P(大写)  随机指定端口


#测试,启动并进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@b85f50aee503 /]#             #root后面跟的就是容器的id

#查看容器内的centos  基本版本,很多命令都是不完善的
[root@b85f50aee503 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

#从容器中退回主机
[root@b85f50aee503 /]# exit
exit

查看当前正在运行的容器

docker ps 命令
	# 列出当前正在运行的容器
-a  # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器  ?的值表示显示最近容器的个数
-q  # 只显示容器的编号

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                     PORTS     NAMES
b85f50aee503   centos        "/bin/bash"   8 minutes ago   Exited (0) 4 minutes ago             hungry_varahamihira
545348204a48   hello-world   "/hello"      47 hours ago    Exited (0) 47 hours ago              hopeful_euclid
f6bda680a5d8   hello-world   "/hello"      47 hours ago    Exited (0) 47 hours ago              brave_wilson

退出容器

exit	# 直接停止容器并退出
Ctrl + P + Q  #容器不停止退出

**删除容器

docker rm 容器id       #根据id删除容器,不能删除正在运行的容器,如果要强制删除,则需要使用rm -f
docker rm -f $(docker ps -aq)  #删除所有容器
docker ps -a -q|xargs docker rm  #删除所有容器

启动和停止容器的操作

docker start 容器id          #启动容器
docker restart 容器id        #重启容器
docker stop 容器id           #停止当前运行的容器
docker kill 容器id           #强制停止当前容器

#容器停止之后容器还是存在的,删除之后容器才会消失

常用的其他命令

后台启动容器

# 命令 docker run -d 镜像名
[root@localhost ~]# docker run -d centos
5ad619b0e07ecdfc766ecb56e9c648d5411ffe6459178a13f742573131a278ae
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 问题 docker ps 发现centos停止了
#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs --help

常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数


#docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   13 seconds ago   Up 10 seconds             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2020-12-27T03:34:22.261693707Z hi
2020-12-27T03:34:27.262609289Z hi
2020-12-27T03:34:32.267862677Z hi
2020-12-27T03:34:37.270382873Z hi
2020-12-27T03:34:42.272414182Z hi
2020-12-27T03:34:47.274823243Z hi
2020-12-27T03:34:52.277419274Z hi

查看容器中进程信息

# 命令 docker top 容器id
[root@localhost ~]# docker top 4b664efe0fc6
UID   PID     PPID    C     STIME     TTY          TIME                CMD
root  17049  17029    0     01:47     pts/0        00:00:00          /bin/bash

查看镜像的元数据

docker inspect 容器id

进入当前正在运行的容器

#命令
# 方式一:
docker exec -it 容器id /bin/bash

# 方式二:
docker attach 容器id 
正在执行的当前代码....

# 两种方式的区别
# docker exec		 # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach		 # 进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的的主机路径

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
4b664efe0fc6   centos    "/bin/bash"   19 minutes ago   Up 19 minutes             quirky_wozniak
[root@localhost ~]# docker attach 4b664efe0fc6
[root@4b664efe0fc6 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@4b664efe0fc6 /]# cd /home
[root@4b664efe0fc6 home]# ls
# touch 新建文件
[root@4b664efe0fc6 home]# touch test.java
[root@4b664efe0fc6 home]# ls
test.java
[root@4b664efe0fc6 home]# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker cp 4b664efe0fc6:/home/test.java /home
[root@localhost ~]# cd /home
[root@localhost home]# ls
admin  test.java  user
[root@localhost home]# 


练习

Docker安装Nginx
# 步骤 
# 1、搜索镜像 建议去dockerHub官网搜,可以看到文档信息
docker search nginx
# 2、下载镜像 
docker pull nginx
# 3、把镜像启动成为容器
docker run -d --name nginx01 -p 3344:80 nginx
run -d --net="host" --name nginx01 -p 80:80 nginx (虚拟机需要加上 --net="host"# 4、查看容器
docker ps

[root@localhost ~]# curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>




端口暴露的概念

在这里插入图片描述

Docker安装Tomcat
#官方的使用
docker run -it --rm tomcat:9.0

#我们之前的启动都是后台,停止了容器之后,容器还是可以查到   docker run -it --rm,一般用来测试,用完就删除

#先下载
docker pull tomcat:9.0

#启动
docker run -d -p 8080:8080 --name:tomcat01 --net="host" tomcat

#启动完成后访问 http://192.168.10.128:8080/

结果

在这里插入图片描述

#原因:
#阿里云镜像的原因。默认是最小镜像,所有不必要的都被剔除掉了。
#保证最小可运行环境

#如果想要看到界面,则需要进入容器内,把webapps.dict下的文件复制到webapps中 
[root@localhost ~]# docker exec -it 9df1173911e6 /bin/bash
root@localhost:/usr/local/tomcat# cp -r webapps.dist/* webapps

可视化

  • portainer(先用这个)

  • Rancher(CI/CD 持续集成和持续部署时再用)

什么是 portainer ?

Docker的图形化管理工具,提供一个后台面板供我们操作。

docker run -d -p 9000:9000 --net="host" --restart=always -v /var/run/docker.sock --privileged=true portainer/portainer  

#注意 虚拟机启动一定要写 --net="host"

访问测试

在这里插入图片描述

可视化面板平时不会使用。

Docker镜像讲解

UnionFS(联合文件系统)

  • 联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

    Docker镜像加载原理

Docker的镜像实际由一层一层的文件系统组成:

  • bootfs(boot file system)主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。
  • rootfs(root file system),包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。
  • 分层理解
    所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。
    容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。

commit镜像

如何提交一个自己的镜像

docker commit 提交容器成为一个新的副本

#命令和Git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

实战测试:

#制作一个带有主页的Tomcat镜像
[root@localhost ~]# docker commit -a="zhanghao" -m="带主页的Tomcat" 0b4fd5a80ffd tomcat02:1.0

#查看镜像
[root@localhost ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat02              1.0       40f4e6060ae0   21 seconds ago   685MB
nginx                 latest    605c77e624dd   9 months ago     141MB
tomcat                9.0       b8e65a4d736d   9 months ago     680MB
portainer/portainer   latest    580c0e4e98b0   18 months ago    79.1MB

#将我们操作过的容器commit成为一个新的镜像!我们以后就可以直接使用我们修改过的镜像。

容器数据卷

什么是容器数据卷

为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。

使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v  主机目录:容器目录

#测试
docker run -it -v /home/ceshi:/home centos /bin/bash

#启动之后,可以通过 docker inspect 容器id 来查看容器的信息

在这里插入图片描述

好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

具名挂载和匿名挂载
#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 /ect/nginx nginx

#查看所有的 volume(卷)的情况
[root@localhost /]# docker volume ls
DRIVER    VOLUME NAME
local     1b408e2fc580305713234601c6166f41eb7b9e249c80b78b6ba1f628b448bf24
local     2dbc1f6f69e7cca09635835bf74eedf0a3b5f331c4faf20a9428c645310db553


 # 具名挂载
docker run -d  -v 卷名:容器内目录  镜像名/id 

在这里插入图片描述

在这里插入图片描述

查看一下这个卷

在这里插入图片描述

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以方便得找到我们的一个卷,大多数情况在使用 具名挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径    #匿名挂载
-v 卷名:容器内路径    #具名挂载
-v /宿主机路径:容器内路径   #指定路径挂载
初识DockerFile

DockerFile 就是用来构建 docker 镜像的构建文件!其实就是一段命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个一个命令,每个命令都是一层

# 1、创建一个dockerfile文件,名字可以随意,建议用DockerFile

# 2、文件中的内容 指令(大写) 参数
FROM centos

COLUME ["volume01","volume02"]

CMD echo "----------end--------"
CMD /bin/bash
# 这里的每个命令就是镜像的一层
# 启动自己写的容器

在这里插入图片描述

这个卷和外部一定有一个同步的目录!

在这里插入图片描述

#查看卷路径
docker inspect 容器id

在这里插入图片描述

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

数据卷容器

多个容器之间同步数据

在这里插入图片描述

docker run -it --name container02 --volumes from container01 镜像名/id  # 将两个容器进行挂载

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用为止。

但是如果一旦持久化到本地,这个时候,本地的数据是不会删除的。

DockerFile

DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

DockerFile构建过程

基础知识

1、每个保留关键字(指令)都必须是大写字母

2、执行从上到下顺序执行

3、#表述注释

4、每一个指令都会创建提交一个新的镜像层,并提交!

在这里插入图片描述

dockerfile是面向开发的,以后我们要发布项目,作镜像,就需要编写dockerfile文件,这个文件十分简单!

docker镜像逐渐成为企业交付的标准,必须要掌握。

DockerFile:构建文件,定义了一切步骤,源代码

DockerImages:通过DockerFile生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务

DockerFile的指令

在这里插入图片描述

实战:构建自己的centos

DockerHub中 99% 镜像都是从 FROM scratch 这个基础镜像过来的,然后配置需要的软件和配置进行构建。

在这里插入图片描述

构建自己的centos

# 1、编写DockerFile的文件
FROM  centos:7
MAINTAINER zhanghao

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "------end-----"
CMD /bin/bash

# 2、通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[版本号]

Docker网络

理解Docker0

清空所有环境

测试 ip addr

在这里插入图片描述

# 问题:docker 是如何处理容器网络访问的?
# 1. 启动一个tomcat
[root@localhost home]# docker run -d -P --name tomcat01 tomcat

# 查看容器的内部网络地址 ip addr,发现容器启动的时候会得到一个   ip地址,这是docker分配的!


#思考 linux 能不能ping 通容器



# linux可以 ping 通 docker 容器


原理

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,只要我们安装了docker,就会有一个网卡docker0。桥接模式,使用的技术是evth-pair 技术!

ATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo “------end-----”
CMD /bin/bash

2、通过这个文件构建镜像

命令 docker build -f dockerfile文件路径 -t 镜像名:[版本号]




### Docker网络

#### 理解Docker0

清空所有环境

> 测试 ip addr 

[外链图片转存中...(img-bFHWgcaE-1680599755649)]

~~~shell
# 问题:docker 是如何处理容器网络访问的?
# 1. 启动一个tomcat
[root@localhost home]# docker run -d -P --name tomcat01 tomcat

# 查看容器的内部网络地址 ip addr,发现容器启动的时候会得到一个   ip地址,这是docker分配的!


#思考 linux 能不能ping 通容器



# linux可以 ping 通 docker 容器


原理

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,只要我们安装了docker,就会有一个网卡docker0。桥接模式,使用的技术是evth-pair 技术!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值