弱小和无知不是生存的障碍,傲慢才是

1.Docker概述

Docker为什么会出现

一款产品:开发->上先 两套环境! 应用环境,应用配置

问题:我的电脑可以运行!版本更新,导致服务不可用!

环境配置十分麻烦,docker就可以解决这个问题

2.Docker思想

隔离

集装箱的每个箱子互相隔离,打包装箱

3.docker的结构

Lib App |Lib App
Kernel

docker和虚拟机的不同:

  • 传统虚拟机,虚拟出硬件,运行完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件
  • 每个容器间互相隔离

4.Docker的优点

  • 应用更快速的交付和部署
  • 更便携的升级和扩缩容
  • 更简单的系统运维
  • 更高效的计算资源利用

5.Docker的名词概念

image-20210513000000059

1.镜像(image):

docker镜像就是一个模板,可以通过镜像创建多个容器.tomcat镜像->run->tomcat01容器

2.容器(container)

docker利用容器技术,独立运行一个或者一组应用,它是通过镜像创建的

启动,停止,删除,基本命令

3.仓库(repository)

存放镜像的地方

公有和私有仓库

6.安装docker

docker安装卸载文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 需要的安装包
sudo yum install -y yum-utils
# 镜像仓库
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io

阿里云镜像加速

文档

7.docker run流程

image-20210513002653977

8.底层原理

docker是怎么工作的?

Docker是一个c/s的结构的系统,Docker的守护运行在主机上。通过Socket从客户端访问!

Docker Server接收到Docker-Client的指令,就会执行这个命令.

xxx

Docker为什么比虚拟机块?

  • Docker有比虚拟机更少的抽象层
  • Docker利用的是宿主机的内核,vm需要是Guest OS

xxx

9.Docker的常用命令

帮助命令 文档 下载

1
2
3
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

10.镜像命令

1.docker images(显示所有镜像)

1
2
3
4
5
6
7
8
9
10
11
12
13
docker images --help
Options:
-a, --all Show all images (default hides intermediate images) #列出所有镜像
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs # 只显示镜像的id

docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# 镜像仓库源 标签 id 创建时间 大小

xxx

2.docker search(镜像搜索)

1
2
3
4
docker search mysql

#可选性
--filter=starts=3000

3.docker pull(拉取镜像)

不写tag就是latest 最新版本

分层下载

1
2
3
docker pull mysql
# 等价于
docker pull docker.io/library/mysql:latest

4.docker rmi(删除镜像)

1
2
3
4
# 通过id删除
docker rmi -f id
# 删除所有
docker rmi -f $(docker images -aq)

11.容器命令

有了镜像才可以创建容器

新建容器并启动

1.docker run(容器启动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run [可选参数] image

# 参数说明
--name="Name" 容器名字
-d 后台启动
-it 交互方式运行,进入容器查看内容
-p 制定端口 -p8080:8080
1.主机:容器
2.容器
3.ip:容器端口
# 交互进行
docker run -it centos /bin/bash
# 退出停止
exit
# 退出不停止
ctrl+p+q

2.查看运行的容器

1
2
3
4
5
6
# 正在运行
docker ps
# 全部
docker ps -a
# -n=? 显示最近创建的容器 ?为个数
# -q 只显示id

3.删除容器

1
2
3
4
5
docker rm 容器id
# 删除所有容器(可以删除活动的容器)
docker rm -f $(docker ps -aq)
# 下面等价
docker ps -a -q|xargs docker rm

4.启动停止操作

1
2
3
4
docker start id
docker restart id
docker stop id
docker kill id

12.其他命令

1
2
3
4
5
docker run -d centos

# 为什么centos停止了?
# docker 后台运行需要一个前台进程,docker发现没有应用,就会自动停止

1.查看日志

1
2
3
4
docker logs --help

dockers log -tf --tail 10 id

2.查看容器进程信息

1
docker top id

3.查看容器元数据

1
docker inspect id

4.进入正在运行的容器

1
2
3
4
# 新窗口
docker exec -it id [/bin/bash]
# 旧窗口,进入正在执行的终端
docker attach -it id [/bin/bash]

5.容器拷贝数据到主机

1
docker cp id:/home/xx /home

13.Docker镜像详解

镜像就是一个独立的软件包

1.UoionFS(联合文件系统)

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

2.docker镜像加载

bootfs引导加载

rootfs linux系统标准目录和文件,rootfs就是不同操作系统的发行版

image-20210513182104650

3.分层理解

所有的docker镜像都始于一个基础镜像层,当修改和增加新的内容之后,就会再当今镜像层上,创建新的镜像层image-20210513182549708

docker镜像都是只读的,当容器启动后,一个新的可读写层被加载到镜像的顶部

(这一层就是我们说的镜像层,镜像层以下都叫做容器层)

4.commit镜像

1
2
docker commit # 提交容器成为一个新的版本
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名称:[tag]
1
2
3
4
5
6
7
8
# 启动一个默认的tomcat

# 发现这个tomcat没有webapps应用

# 我自己做了一些操作

# 提交
docker commit -a="codelorin" -m="add webapps" 容器id 目标镜像名称:版本

14.容器数据卷

数据可以持久化

Mysql的数据可以储存在本地

容器之间可以有一个数据共享的功能

1.使用

直接使用命令挂载

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

2.实战同步mysql

1
2
3
4
5
6
7
8
9
10
docker pull mysql:5.7
# 启动mysql
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=密码 --name mysql5.7 mysql:5.7

#
-d 后台
-p 端口映射
-v 卷挂载
-e 环境配置
--name 名字

3.具名挂载和匿名挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 匿名挂载 只写了容器内的路径
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有数据卷的情况
# docker volume
create
inspect 查看
ls
prune
rm

# 具名挂载
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx

扩展 可以使用:ro :rw 改变读写权限

1
2
docker run -d -p --name nginx -v juming-nginx:/etc/nginx:ro nginx
# ro只能通过宿主机改变,容器无法操作

15.DockerFile

1.初见dockerfile

1
2
3
4
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
1
docker build -f dockerfile -t ./centos:1.0

2.数据卷容器

1
2
docker run -it --name docker02 --volumes-from docker01
# 这样docker01 02会自动同步

容器数据卷的生命周期一直持续到没有容器使用为止

3.构建步骤

  • 编写一个dockerfile文件
  • docker build 构建成为一个镜像
  • docker run 运行镜像
  • docker push 发布镜像(Docker Hub或者阿里云镜像仓库)

基础知识:

  • 指令是大写字母
  • #注释
  • 每个指令都会创建提交一个新的镜像层

指令

1
2
3
4
5
6
7
8
9
10
11
12
FROM xxx  # 基础镜像,一切从这里开始构建
MAINTAINER # 名字+邮箱
RUN # docker构建需要运行的命令
ADD # 步骤:tomcat镜像,tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口
CMD # 指定容器启动需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定容器运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Dockerfile 就会运行ONBUILD的指令,触发指令
COPY # 类型ADD,将我们文件拷贝到镜像中
ENV # 设置环境变量

4.实战构建centos

1
2
3
4
5
6
7
8
9
10
11
FROM centos
MAINTAINER codelorin<codelorin@163.com>
ENV MYPATH /user/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
1
docker build -f dockerfile -t mycentos:0.1 .
1
docker history 容器id

5.CMD和ENTRYPOINT的区别

1
2
CMD # 指定容器启动需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定容器运行的命令,可以追加命令
1
2
3
FROM centos
CMD ["ls","-a"]

1
2
3
docker run id -l
# 报错CMD使用-l替代了ls-a
# ENTRYPOINT则会在末尾追加-l

6.制作tomcat镜像

1.准备tomcat,jdk压缩包

2.编写dockerfile 官方建议:Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM centos
MAINTAINER codelorin<codelorin@163.com>
COPY readme.md /user/local/readme.md
ADD jdk.tar.gz
ADD tomcat.tar.gz

RUN yum -y install vim
ENV MYPATH /user/local
WORKDIR $MYPATH

ENV JAVA_HOME /user/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /user/local/apache-tomcat
ENV CATALINA_BASH /user/local/apache-tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /user/local/apache-tomcat/bin/startup.sh && tail -F /usr/local/apache-tomcat/bin/logs/catalina.out

7.Docker-Hub发布镜像

1
2
3
docker login -u bylorin -p xxx
docker tag id codelorin/tomcat:1.0
docker push codelorin/tomcat

8.阿里云发布镜像

详见阿里云镜像官网

1.创建命名空间

2.创建容器镜像

16.Docker网络

待更新