【Docker】docker笔记(待发布)

Docker(一):Docker安装与底层原理

本文主要内容:Docker安装与底层原理

Docker的组成

【Docker】docker笔记(待发布) - 图2

镜像(image):

Docker镜像就相当于是一个文件系统,通俗来说就是为容器用来创建容器的

容器(Container):

Docker 利用容器 (Container) 独立运行的一个或一组应用,容器是用镜像创建的运行实例,它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台,可以把容器看做是一个简易版的Linux系统
容器就相当于Java中的对象,镜像相当于Java中的类

仓库(Repository)

仓库是集中存放镜像文件的场所
仓库注册服务器 (Registry) 上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签
仓库分为公开仓库和私有仓库两种形式
最大的公开仓库是DockerHub存放了数量庞大的镜像供用户下载,国内的公开仓库包括阿里云等

Docker的安装

1.需要Liunx版本为CentOS7.0以上
2.卸载旧版本(非必须项)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3.安装Docker所需要依赖
yum install -y yum-utils
4.设置yum镜像仓库
yum-config-manager —add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.安装Docker
yum -y install docker-ce docker-ce-cli containerd.io
6.设置阿里云镜像加速
【Docker】docker笔记(待发布) - 图3)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://qhyb8ixp.mirror.aliyuncs.com“]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
7.Dcoker服务
service docker start
8.测试Docker-HelloWorld程序
[root@iZ8vbi9mx98t2s78lyxfpuZ ~]# docker run hello-world
Unable to find image ‘hello-world:latest’ locally
docker run hello-worldlatest: Pulling from library/hello-world
0e03bdcc26d7: Already exists
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker! —> 出现这句话代表Docker安装没有问题
This message shows that your installation appears to be working correctly.
9.卸载Docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源 /var/lib/docker 是docker的默认工作路径!
rm -rf /var/lib/docker

Docker的底层原理

Docker的工作原理

Docker是基于C/S结构的系统,Docker的守护进程运行在Linux服务器(宿主机)上,当我们在Linux服务器上(Docker-Client)输入Docker相关命令就会被发送给Doker-Server

为什么Docker比VM(虚拟机)快

1、Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker将会在效率上有明显优势
2、当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核,因而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS(虚拟机中的操作系统),这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个Docker容器只需要几秒钟
×

Docker(二):Docker常用命令和安装Nginx与Tomcat

本文主要内容:Docker常用容器、镜像命令和安装Nginx与Tomcat

Docker帮助命令

  1. docker version # 显示Docker的版本信息
    2. docker info # 显示Docker的系统信息(包含镜像与容器的数量)
    3. docker 命令 —help # 查看帮助(就是显示这个命令有什么可选项)

    Docker镜像命令

  2. docker images:显示本机上所有安装镜像
    [root@MT ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB

可选项
docker images -a # 列出所有的镜像
docker images -q # 只显示镜像的id

[root@MT ~]# docker images -aq
470671670cac
bf756fb1ae65

  1. docker search:搜索镜像
    [root@MT ~]# docker search mysql(镜像名)

NAME DESCRIPTION STARS
mysql MySQL is a widely used, open-source relation… 9553
mariadb MariaDB is a community-developed fork of MyS… 3471

可选项
docker search mysql -f=STARS=3000 # 列出镜像星数大于3000的镜像

  1. docker pull:下载镜像
    [root@MT ~]# docker pull mysql # 下载最新版本的MySQL
    [root@MT ~]# docker pull mysql:5.7 # 下载指定版本的MySQL
  2. docker rmi:删除镜像
    docker rmi -f 镜像id # 删除指定的镜像
    docker rmi -f 镜像id 镜像id 镜像id 镜像id # 删除指定的镜像
    docker rmi -f $(docker images -aq) # 删除全部的镜像

    Docker容器命令

  3. docker run [可选参数] 镜像名
    [root@MT ~]# docker run 可选参数 镜像名

可选参数
—name=”xxx“ # 指定容器名字 或 —name XXX
-d # 后台模式运行
-it # 使用交互模式运行,进入容器查看内容
-p(小写) # 指定端口映射 如:-p 8080(宿主机):8080(容器)
-P(大写) # 随机端口映射

测试启动进入与退出容器
[root@MT ~]# docker run -it centos /bin/bash # /bin/bash是使用命令行进入
[root@6130f0353526 /]# ls # 此时已经进入Docker的CentOS容器
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@6130f0353526 /]# exit
exit
[root@MT ~]#

  1. docker ps [可选参数]:列出运行的容器
    [root@MT ~]# docker ps 可选参数

可选参数
-a # 列出正在运行和历史运行过的容器
-q # 列出容器ID

[root@MT ~]# docker ps -aq
6130f0353526
895577bc1ae7
f9fc9c23267d
faab3fceb1d3

  1. 退出容器
    exit # 容器直接退出
    Ctrl + P + Q # 容器不停止退出
  2. 删除容器
    docker rm -f 容器id # 删除指定容器(不能删除正在运行的,如需删除使用rm-rf)
    docker rm -f $(docker ps -aq) # 删除所有容器
  3. 启动和停止容器操作
    docker start 容器id # 启动容器
    docker restart 容器id # 重启容器
    docker stop 容器id # 停止正在运行的容器
    docker kill 容器id # 强制停止

    Docker其它命令

    容器后台方式运行

    [root@MT ~]# docker run -d centos
    748d11ff226983ab8281fc6741087e6a3f349ad03f0cadafcd215aed894978dc
    [root@MT ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    # 问题:我们此时已经发现启动CentOS,但是确查不到正在运行的容器
    # 解释:Docker容器使用后台运行,就必须要有要一个前台进程,Docker发现没有应用,就会自动停止

    查看日志

    docker logs -tf 容器id # 查看实时日志
    docker logs -t —tail 数量 容器id # 查看指定数量的日志

    查看容器中的进程信息

    docker top 容器id

    查看镜像的元数据

    docker inspect 容器id

    进入当前正在运行的容器

    通常我们是使用后台方式运行容器,因为我们可能需要进入容器,修改配置

docker exec -it 容器ID /bin/bash (常用)
# docker attach 容器ID

exec方式:就是类似新开一个窗口连接运行的容器
# attach方式:就是直接连入当前的容器

拷贝容器内文件到宿主机中

docker cp 容器id:文件路径(容器内) 目的路径(宿主机)
[root@MT ~]docker cp 1a9a6785c37c:/home/c.java /home/

Docker安装Nginx

1. 搜索镜像 search 建议大家去docker搜索,可以看到帮助文档
docker search nginx
# 2. 拉取镜像 docker pull nginx
docker pull nginx
# 3. 运行测试
# -d 后台运行
# —name 给容器命名
# -p 宿主机端口:容器内部端口(我这里使用阿里云的3344端口,前提要在阿里云安全组开放次端口)
docker run -d —name nginx -p 3344:80 nginx
# 4.查看镜像
docker ps
# 5.测试是否成功
curl localhost:3344 # 或者在浏览器输入ip:3344

Docker安装Tomcat

下载tomcat镜像
docker pull tomcat:9.0
# 运行tomcat镜像
docker run -d tomcat -p 3344:8080 tomcat
# 测试
curl localhost:3344 # 此时发现无法访问
# 原因:tomcat容器里面webapps目录下没有文件
# 进入容器
docker exec -it ef41045bea2b /bin/bash
cp -r webapps.dist/* webapps
# 重新测试 在浏览器输入ip:3344 —> 发现成功访问
×

Docker(三):理解Docker镜像、Docker容器数据卷和DockerFile

本文主要内容:深入理解Docker镜像、Docker容器数据卷和DockerFile

Docker镜像理解


Docker镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件

Docker镜像加载原理

UnionFs:联合文件系统

UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,UnionFs联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

Docker的镜像实际上由一层一层的UnionFs文件系统组成
bootfs:主要包含 bootloader和 Kernel,bootloader主要是引导加 kernel,Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含bootfs加载器和内核,当bootfs加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs:在 bootfs之上,包含的就是典型 Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如:Ubuntu,、CentOS等等
简单理解:
1. 对于Docker安装OS来说:就是Docker使用了Linux本身的bootfs,只需要安装自己所需的rootfs
2. 对于Docker安装普通镜像来说:就是Docker本身是分层下载镜像,所以可以提取出公共层镜像,进行复用

Docker镜像的特点

Docker镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部
这一层就是我们通常说的容器层,容器之下的都叫镜像层
【Docker】docker笔记(待发布) - 图4-

Docker容器数据卷


什么是容器数据卷

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

容器数据卷使用命令

命令
docker run -it -v 主机目录:容器内目录 /bin/bash

挂载MySQL数据库到Liunx宿主机

1. 下载MySQL
docker pull mysql
# 2. 启动并挂载 -e:特别注意需要设置密码
docker run -d -p 3344:3306 -v /home/conf:/etc/mysql/conf.d -v /home/logs:/logs -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
此时我们使用远程连接软件会报错
【Docker】docker笔记(待发布) - 图5-
# 解决报错
# 1. 进入容器内
docker exec -it 容器ID /bin/bash
# 2. 进入MySQL
mysql -uroot -p123456
# 3. 授权
mysql> GRANT ALL ON . TO ‘root’@’%’;
# 4. 刷新权限:
mysql> flush privileges;
# 5. 更新加密规则:
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE NEVER;
# 6. 更新root用户密码:
mysql> ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
# 7. 刷新权限:
mysql> flush privileges;

具名和匿名挂载

-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
Docker容器内的卷,在没有指定目录的情况下都在/var/lib/docker/volumes/xxx/_data下

拓展:绑定权限

通过 -v 容器内路径:ro rw 改变读写权限
ro # readonly 只读
rw # readwrite 可读可写
docker run -d nginx01 -v nginxdemo:/etc/nginx:ro nginx
docker run -d nginx01 -v nginxdemo:/etc/nginx:rw nginx
# ro:只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

数据卷容器挂载

目的:实现多个容器间的数据同步(多个MySQL间共享数据)
# 使用 —volumes-from 容器名称 此命令实现数据卷容器挂载
docker run -d —name mysql02 -p 3345:3306 —volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql

DockerFile

DockerFile是用来构建Docker镜像的文件(命令参数脚本)

DockerFile构建指令

FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!

创建一个自己的CentOS镜像

ENV MYPATH /usr/local
WORKEDIR $MYPATH

RUN yum -y install vim

EXPOSE 80

CMD /bin/bash

  • 构建自己的镜像 (当名字为Dockerfile时 可以省略-f Dockerfile)
    docker build -f mycentos -t mycentosdemodo:1.0 .
  • 查看镜像生成历史
    docker history 镜像ID

    创建Tomcat镜像

    1.准备镜像文件:Tomcat和JDK的压缩包
    2.编写DockerFile
    FROM centos
    MAINTAINER fortuneteller[1746344046@qq.com](mailto:1746344046@qq.com)

COPY README.txt /usr/local/README.txt

ADD jdk-8u251-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.35.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-toacat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD [“/usr/local/apache-tomcat-9.0.35/bin/catalina.sh”, “run”]
3.打包镜像
# 这里使用的是Docker明白命名的脚本(Dockerfile),所以省略-f
docker build -t mytomcat .
4.启动镜像
docker run -d -p 3344:8080 —name mttomcat -v /home/fortuneteller/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/fortuneteller/tomcat/logs:/usr/local/apache-tomcat-9.0.35/logs mytomcat
5.测试运行
【Docker】docker笔记(待发布) - 图6
6.在宿主机的/home/fortuneteller/tomcat/test目录下创建WEB-INF目录与mt.jsp
<%@ page contentType=”text/html;charset=UTF-8” language=”java” %>





—————welcome——————
<%=”这是一个测试页面”%>


7.在WEB-INF目录下编写web.xml文件
<?xml version=”1.0” encoding=”UTF-8”?>
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=”http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
version=”3.1”>
test

8.测试访问
【Docker】docker笔记(待发布) - 图7

本地镜像上传阿里云

1.登陆阿里云容器镜像服务
2.创建命名空间
3.创建仓库
4.设置固定密码
【Docker】docker笔记(待发布) - 图8
5.查看自己的推送命令
【Docker】docker笔记(待发布) - 图9
6.使用推送命令完成上传
【Docker】docker笔记(待发布) - 图10
7.拉取时同理根据阿里云提示命令完成即可


Docker总结

【Docker】docker笔记(待发布) - 图11-
×

Docker(四):Docker部署SpringBoot项目

本文主要内容:使用Docker部署SpringBoot项目

1.使用Maven构建获得jar包
2.编写Dockerfile
FROM java:8

COPY *.jar /app.jar

CMD [“—server.port=8080”]

EXPOSE 8080

ENTRYPOINT [“java”, “jar”, “app.jar”]
3.上传Docker与jar包到Linux服务器
4.使用命令获得镜像
docker build -t ideatest .
5.使用命令查看构建到的镜像编号
docker images
6.启动镜像
docker run -d -p 3344:8080 ideatest # 3344端口需要提前在阿里云放开
7.测试访问
在浏览器输入:服务器ip:3344