Docker入门到实践(上)

本文详细介绍 Docker 的核心功能,包括 DevOps 中的应用交付与部署、系统运维简化及计算资源高效利用。对比虚拟机技术,阐述 Docker 容器的轻量化优势,并提供安装指南与基本命令演示,适合初学者快速上手。

Docker概述

。。。。

Docker能干什么。

DevOps(开发 运维)

应用更快速的交付和部署
传统一堆帮助文档,安装程序。
docker:打包镜像发布测试,一键运行
更快捷的升级和扩缩容
使用docker之后,我们部署应用就像搭积木一样!
项目打包为一个镜像,扩展
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用
Docker 是内核级别的虚拟化,可以再一个物理机器上运行很多容器实例,服务器的性能可以被压榨到极致。。

Docker 容器 与虚拟机技术的不同

  • 传统的虚拟机,虚拟一条硬件,运行一个完整的操作系统,然后在这个系统安装和运行软件。
  • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核,也没有虚拟我们的硬件,所以就很轻便。
  • 每个容器间相互隔离,每个容器内都有一个属于自己的文件系统,互不影响
  • 打包镜像发布测试,一键运行

安装Docker

docker基本组成

在这里插入图片描述
镜像(image):
docker镜像就是一个模版,可以通过模版进行创建容器服务。
容器(container):
Docker利用容器的技术,独立运行一个或多个应用,通过镜像创建。
启动,删除,停止等操作!
仓库:
仓库就是存放镜像的地方!
仓库分为公有和私有仓库!

安装docker

环境准备
contos7

安装

# 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 \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
# 4. 软件更新
yum makecache fast

# 5 安装docker
yum install docker-ce docker-ce-cli containerd.io

# 6. 启动docker
systemctl start docker
# 卸载docker
yum remove docker-ce docker-ce-cli containerd.io

删除资源
 sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd

阿里云镜像加速
1.访问 访问 https://help.aliyun.com/document_detail/60750.html
在这里插入图片描述
2.点击镜像加速器
在这里插入图片描述
3.配置

vim /etc/docker/daemon.json

# 添加如下内容,具体地址自己申请咯
{
  "registry-mirrors": ["https://****.mirror.aliyuncs.com"]
}

# 重启服务
systemctl daemon-reload
systemctl restart docker

底层原理

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机中,然后通过socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器(容器,是一个运行时环境)
在这里插入图片描述

容器的基本命令

帮助命令

# 查看信息
docker info
docker --help

# 查看版本
docker version

// 官网命令文档 :https://docs.docker.com/reference/

镜像命令

## 搜索镜像
docker search 镜像名称

# 下载镜像 
docker pull image:版本
# 不指定版本
docker pulll image

#删除镜像
docker  rmi  imagrName
#删除所有镜像
docker  rmi -f $(docker images -q)

容器命令

:先有镜像才有 容器。
下载一个contos镜像来测试练习

docker pull contos

新建容器并启动

docker run  [可选参数] image
- p	指定容器端口
--name	 容器名称
-d			后台运行
-P		随机指定端口
-it。 使用交互方式运行,进行容器查看内容

# 测试,进入容器
docker exec -it image  /bin/bash

# 从容器中退出
exit

列出容器

docker ps 		#列出容器
docker ps -a	#列出正在运行的容器

删除容器

docker rm 容器id  # 删除容器
docker rm -f $(docker ps -aq)  #删除所有容器

启动和停止容器的操作

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

常用其他命令

查看容器日志

docker logs 容器id		#查看容器日志
docker logs 容器id	-tf --tail  20 	容器日志		#查看尾部20行日志

查看镜像的元数据

docker inspect	 容器id 

查看容器进程信息ps

docker top 容器id

进入容器

docker exec -it  容器id		/bin/bash。# 开启一个新窗口 进入容器
docker attach	容器id 			# 进入正在运行的容器中

从容器中拷贝到主机

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

# 例如
# 进入容器 创建文件
docker	attach	baxxxx
touch test.java
# 拷贝 到主机
cp baxxxx:/test.java. /home

练习

安装nginx 并启动

bash
docker pull nginx

docker run -d --name=nginx1 -p 80:80 nginx

测试
curl localhost:80
···

Docker 镜像讲解

镜像是什么

镜像是一个轻量级,可执行的独立软件包,用来打包软件运行环境和基本
运行环境开发的软件。包含软件运行某个软件所需的所有内容,包括代码、运行时的库、环境变量、配置文件。
所以的应用,直接打包docker镜像,就可以直接跑起来。
如何获得镜像呢?

  1. 从远处仓库下载
  2. 自己制作一个镜像DockerFile
  3. 朋友拷贝

Docker 镜像加载原理

UnionFs(联合文件系统)

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

Docker镜像加载原理

在这里插入图片描述
bootfs
rootfs

平时我们安装进虚拟机的contos有好几个g ,为什么docker 安装contos才几百m呢?

对于精简的os,rootfs可以很小,只要包含基本的命令 工具,程序库就可以了。因为底层就直接用host的kernel,自己只需要提供rootfs就可以了。因此不同的linux发型版本,bootfs基本是一样的,rootfs会有差别,因此不同的发行版可以公用 bootfs

虚拟机上分钟级别,容器上秒级

分层理解

在这里插入图片描述

docker镜像就上一层一层的。差不多可以理解成这样!

分层
war包
依赖
容器层
tomcat镜像层
底层操作系统

特点

Docker容器都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部。
这一层就是我们通常说的容器层,容器层之下都叫镜像层!

如何提交自己的镜像呢?

commit 镜像

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

# 命令和git差不多
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[Dtag]

练习 tomcat默认webapps里面为空 将webapps.dist里面的文件复制到webapps 并且打包成镜像

docker pull tomcat:8.5   # 拉取tomcat
docker run --name=tomcat1 -d -p 8080:8080 tomcat:8.5 #启动容器
docker exec -it qeqs1398899	/bin/bash	# 进入容器发现webapps里面啥都没。。东西都在webapps。dis里面
 cp -r webapps.dist/* webapps/
 exit	#退出

打包修改后的tomcat 成我们自己的镜像
docker commit -m="add webapps app" -a="herman" 1e568b342624 tomcat-my:1.0
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
tomcat-my    1.0       b4ba4dde5daa   7 seconds ago   538MB
tomcat       8.5       bb8fa2738348   3 days ago      533MB

容器数据卷

什么是数据卷

docker 将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求;数据可以持久化
MySQL 容器删了,删库跑路!需求:mysql数据可以存储在本地!
容器之间可以有一个数据共享的技术!docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

它的主要目的:容器的持久化和同步操作!容器间也说可以数据共享的

使用数据卷

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

docker run -v 主机目录:容器内目录
# 测试
 docker run -d --name=tomcat1 -p 8080:8080 -v /home/tomcat/webapps/manager/:/usr/local/tomcat/webapps/manager/ tomcat-my:1.0

# 编辑
cd /home/tomcat/webapps/manager/
vi index
hello

# 测试
curl local:8080/manager/hello

实战MySQL

# 拉取mysql
docker pull mysql:5.7
# 启动mysql并持久化
docker run -d --name=mysql1 -p 3306:3306 \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD="root" mysql:5.7
# 进入容器中
[root@localhost mysql]# docker exec -it bc /bin/bash
root@bc43095acebc:/# mysql -uroot -proot -hlocalhost
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database test
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> use test
Database changed
mysql> create table test(id int)
    -> ;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into test values (1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
mysql> quit
Bye
# 退出
root@bc43095acebc:/# exit

进行 将容器删除 看看数据有没有丢

[root@localhost mysql]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
bc43095acebc   mysql:5.7    "docker-entrypoint.s…"   16 minutes ago   Up 4 minutes    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql1
4163a2a3b1c9   tomcat:8.5   "catalina.sh run"        50 minutes ago   Up 50 minutes   0.0.0.0:8082->8080/tcp, :::8082->8080/tcp              tomcat2
779cc476b4c5   tomcat:8.5   "catalina.sh run"        55 minutes ago   Up 55 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              tomcat1
[root@localhost mysql]# docker stop bc
bc
[root@localhost mysql]# docker rm bc
bc
[root@localhost mysql]# docker ps -a
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS          PORTS                                       NAMES
4163a2a3b1c9   tomcat:8.5   "catalina.sh run"   51 minutes ago   Up 51 minutes   0.0.0.0:8082->8080/tcp, :::8082->8080/tcp   tomcat2
779cc476b4c5   tomcat:8.5   "catalina.sh run"   56 minutes ago   Up 56 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat1
[root@localhost mysql]# docker run -d --name=mysql1 -p 3306:3306 \
> -v /home/mysql/log:/var/log/mysql \
> -v /home/mysql/data:/var/lib/mysql \
> -v /home/mysql/conf:/etc/mysql \
> -e MYSQL_ROOT_PASSWORD="root" mysql:5.7
391efac750170136e3ca0a054651e66122f4d47dacbcfc4e63dc82ad80dfa2c2

# 进入容器中
[root@localhost mysql]# docker exec -it bc /bin/bash
root@bc43095acebc:/# mysql -uroot -proot -hlocalhost

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

具名和匿名挂载

# 匿名挂载 
-v:容器内路径
 docker run -d --name=tomcat1 -p 8080:8080 -v:/usr/local/tomcat/webapps/manager/index.jsp tomcat:8.5
# 查看所有的volume的情况
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     3eef4881b55d49d6dc960a374bc359810e6d7bb3bf1db09b82cb5554127743c3

# 这里是匿名挂载是不显示挂载路径的

# 具名挂载
-v 具名:容器内路径

docker run -d --name=tomcat2 -p 8082:8080 -v tomcat-juming:/usr/local/tomcat/webapps/manager/index.jsp tomcat:8.5
# 查看所有的volume的情况
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     3eef4881b55d49d6dc960a374bc359810e6d7bb3bf1db09b82cb5554127743c3
local     tomcat-juming

# 查看挂载详细路径
docker inspect tomcat-juming/容器id  

"Mounts": [
            {
                "Type": "volume",
                "Name": "tomcat-juming",
                "Source": "/var/lib/docker/volumes/tomcat-juming/_data",
                "Destination": "/usr/local/tomcat/webapps/manager/index.jsp",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

所有docker 容器内的卷,没有指定目录的情况下都在***/var/lib/docker/volumes/tomcat-juming/_data***
我们通过具名挂载可以方便的找到我们的一个大卷,大多数情况下使用的 具名挂载

拓展

docker run -d --name=tomcat2 -p 8082:8080 -v tomcat-juming:/usr/local/tomcat/webapps/manager/index.jsp:ro tomcat:8.5
docker run -d --name=tomcat2 -p 8082:8080 -v tomcat-juming:/usr/local/tomcat/webapps/manager/index.jsp:rw tomcat:8.5

在网上可以看到挂载路径会出现 :ro 或:rw。代表着权限。
ro:只读
rw:可读可写

初步了解DockerFile

除了使用commit 打包镜像,还有DockerFile也可以直接打包镜像,经常使用哦

vi DockerFile

FROM  xxx:tag. # 基本环境
VOLUME ['volume1'],['volue2'] #挂载路径
CMD echo "-----end----"
CMD /bin/bash

案例
打包一个nginx镜像

vi DockerFile
FROM nginx
VOLUME ["volume01","volume02"]
CMD echo "-----end---"
CMD /bin/bash
 # 进行打包我们的镜像
[root@192 docker_file]# docker build -f DockerFile -t 'wmj/nginx:1.0' .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM nginx
 ---> 08b152afcfae
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in f309ed8506fd
Removing intermediate container f309ed8506fd
 ---> c0cc3c4f9315
Step 3/4 : CMD echo "-----end---"
 ---> Running in 3c361babb9f4
Removing intermediate container 3c361babb9f4
 ---> 6a2fc2cd50cc
Step 4/4 : CMD /bin/bash
 ---> Running in ea3720d5687f
Removing intermediate container ea3720d5687f
 ---> 10fb2158e9e1
Successfully built 10fb2158e9e1
Successfully tagged wmj/nginx:1.0
[root@192 docker_file]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
wmj/nginx    1.0       10fb2158e9e1   8 minutes ago   133MB
# 使用的匿名挂载 外部文件与内部文件同步数据
VOLUME ["volume01","volume02"]

匿名挂载

Docker入门到实践(下):https://blog.youkuaiyun.com/onlyonemingming/article/details/119344061

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值