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镜像,就可以直接跑起来。
如何获得镜像呢?
- 从远处仓库下载
- 自己制作一个镜像DockerFile
- 朋友拷贝
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

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


1164

被折叠的 条评论
为什么被折叠?



