Docker学习初步总结

声明

本篇是本人在B站看视频学习并总结的东西;如果对视频有兴趣我可以推荐予你。另外,内部有些指令验证的不是太全面;若有错误,请指出,谢谢。

引言

Docker就是容器技术。就如官方所说:帮助开发人员以及开发团队构建和发布应用。

为什么使用Docker

a.Docker将程序和使用软件环境直接打包在一起,无论在哪个机器上都保证了环境的一直性  ----》一致的运行环境,更轻松的迁移
b.解决了环境隔离,别人的程序不会影响到自己的程序
c.通过镜像复制多个环境一致的容器

logo解释

a. 鲸鱼图形   ----》 docker引擎
b.身上的箱子  ----》代表通过docker启动的一个一个软件环境,容器与容器之间是互相隔离的,

与虚拟机的区别

虚拟机:

a.虚拟机运行软件之前必须自身携带操作系统,本身很小的应用因为携带操作系统而变得非常大,很笨重
b.通过虚拟机在资源调度上经过很多步骤,另外在调用宿主机的cpu、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内容,整个调用过程是虚拟内容--》虚拟物理内存--》真正物理内存

docker:

Docker是不携带操作系统,所以docker的应用就非常轻巧
docker引擎分配资源直接是   虚拟内存---》真正物理内存

对比表:

----传统虚拟机docker容器
磁盘占比几个G到十几个G左右几十M到几倍M
cpu内存占比非常占用cpu和内存占用极低
启动速度几分钟几秒
安装管理需要专门的运维技术安装管理方便
应用部署每次部署都费时费力第二次开始轻松简便
耦合性多个应用在同一机器上容易互相影响容器隔离
系统依赖性需要相同或者相似的内核

核心架构图

image

安装

目前支持主流操作系统,window macos linux uninx

windows:

下载:https://desktop.docker.com/win/stable/amd64/Docker%20Desktop%20Installer.exe

安装:使用winget安装

winget install Docker.DockerDesktop
winget install Docker.DockerDesktopEdge

要求:支持64位window 10 pro 且必须开启Hyper-V 或者64位版本的win 10 home v-1903及以上;开启Hyper-V步骤:打开控制面板—》程序—》启用或关闭window功能,找到Hyper-V并勾选上。

linux

通用所有平台安装 bash安装

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

启动|关闭|重启docker

systemctl start|stop|restart docker

检测docker启动成功

docker info 查看安装docker引擎版本

开机自启动

systemctl enable docker

建立docker用户组

sudo groupadd 组名
sudo groupadd docker
//查看用户组是否创建
sudo cat /etc/group|grep 组名
//当前用户加入组
sudo usermod -aG docker $USER
//指定用户加入
sudo usermod -aG docker 用户名
//加完记得重启

docker核心概念

镜像 image 复数images

定义:一个镜像代表一个软件 如:redis,mysql镜像。

特点:只读

容器 container

基于某个镜像运行一次就是一个程序实例,一个程序实例称之为一个容器

特点:可读可写

仓库 repository

定义:用来存储docker中所有镜像具体位置

远程仓库:docker在世界范围维护一个唯一的仓库;远程仓库的web界面:docker hub(https://hub.docker.com/)

本地仓库:当前自己机器中下载镜像存储位置

下载镜像的加速设置

1.安装docker后设置下载加速服务器
2.注册阿里云账号
3.登录账号--》管理控制台 --》产品服务中找到容器镜像服务-->在打开的页面中找到镜像加速器
然后切换使用的系统--》运行提供的命令
例如:sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xhkieyug.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker初步应用

入门案例

docker run hello-world

总结:1.docker run 镜像名 根据run后面的镜像运行一个容器

2.在运行之前,先在本地仓库中查找对应的镜像;找到直接使用,找不到自动去远程仓库中下载

docker引擎及镜像相关操作

1.查看docker引擎和帮助命令

docker info   用来展示docker信息
docker version docker版本信息
docker --help ||docker docker帮助命令

docker命令格式 docker [options] command
2.docker镜像命令

a.查看本地存在哪些镜像 
docker images [-a]
-a不写效果一样|-q表示只显示|镜像名 表示过滤该镜像名
注意TAG表示版本  CREATED表示镜像创建时间(非本地创建)

b.下载新的镜像 
docker pull 镜像名:版本
docker pull mysql:5.6.50
或者docker pull 镜像名:@DIGEST(摘要)

c.通过命令行来搜索镜像版本
docker search 镜像名[:版本号]
docker search redis[:4.3.0]
出现后注意以official为ok的作为官方

d.删除镜像
docker image rm 镜像名:tag/镜像id
docker rmi 镜像名:tag/镜像id
强制删除
docker image rm -f 镜像名:tag/镜像id
docker rmi -f 镜像名:tag/镜像id

e.帮助命令
docker image --help

3.容器相关命令

docker run --help帮助命令
将打包的镜像文件导入到自己的docker仓库
docker load -i 导入的镜像文件名
1.运行一个容器
docker run 镜像名:tag/镜像id
docker run tomcat:8.0-jre8
//宿主机端口与容器端口进行映射
docker run -p 8080(宿主机端口):8080(容器端口) 镜像名:tag/镜像id
//启动容器需后台运行
docker run -p 8080(宿主机端口):8080(容器端口) -d(后台运行) 镜像名:tag/镜像id
//容器指定名称
docker run -d -p 8081:8080(-p可以写多个) --name 命名 镜像名:tag

2.查看当前的容器
docker ps  查看正在运行的容器
docker ps -a 查看所有的容器(运行& 非运行)
docker ps -q 正在运行的容器id
docker ps -qa 所有的容器id

3.停止/重启容器的命令
docker start 容器名/容器id         开启
docker restart 容器名/容器id       重启
docker stop 容器名/容器id          正常停止
docker kill 容器名/容器id          立即停止

4.删除容器
docker rm 容器名/容器id          删除停止的容器
docker rm -f 容器名/容器id       强制删除容器
docker rm -f $(docker ps -aq)    强制删除所有的容器

5.查看容器内服务运行日志
docker logs  容器id/容器名
docker logs -f  容器id/容器名   实时展示日期
docker logs -tf  容器id/容器名   加入时间戳
docker logs -tail N  容器id/容器名   查看日志最后N行

6.查看容器内进程
docker top 容器id/容器名      

7.与容器内部进行交互
docker exec -it   容器id或者容器名  bash
退出容器 exit

8.操作系统与容器的传输文件
从容器复制文件到操作系统:docker cp 容器标识(id,name):容器文件路径 操作系统路径
从操作系统复制文件到容器:docker cp 文件|目录名 容器唯一标识:容器目标路径

容器内部操作

1.容器内部细节
docker inspect 容器id|容器名称

2.数据卷 Volume
作用:实现宿主机系统与容器之间的文件共享
使用:
    启动容器并标明要开启数据卷
    docker run -d -p 8080:8080 --name 容器名 -v 宿主机文件绝对路径:容器内的目录 镜像:tag/镜像id
    自动数据卷目录
    docker run -d -p 8080:8080 --name 容器名 -v 数据卷名:容器内的目录 镜像:tag/镜像id
    注意:数据卷名可以随便写,docker不存在这个数据卷时会自动创建并同时映射到宿主机的某个目录中。而且启动时会将aa容器中的全部内容复制到映射目录中。

3.将容器打包成一个镜像
docker commit -m '描述信息' -a '作者信息' (容器id/容器名称) 打包的镜像名:tag

4.将镜像备份出来
docker save 镜像名:tag -o 文件名
docker save test-tomcat:1.0 -o test-tomcat-1.0.tar

镜像原理

定义:一个镜像代表一个可以独立运行的软件包。包含运行软件的所有内容:代码、运行时所需库、环境变量和配置文件

为什么这么大:
原因:一个软件镜像不仅仅是原来软件包,包含软件所需的操作系统依赖, 软件自身依赖以及自身软件包组成。

为什么docker采用镜像分层原理:
注意:docker在设计镜像时每一个镜像都是有n个镜像组成。
原理:UnionFs(联合文件系统):就是一次加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终文件系统包含所有底层文件和目录

为什么采用联合系统
好处:可以资源共享,采用分层机制实现基础层共享,从而减小docker仓库整体体积

容器网络

1.容器与操作系统
在docker启动时,会自动创建一个docker0网桥,实际就是linux的bridge可以理解为一个软件交换机,它会挂载到它的网口之间进行转发
为什么提供网络功能:docker允许通过外部访问容器或容器互联的方式来通过网络
2.docker网络的使用
注意:一般在使用docker网桥实现容器与容器通信时,都是站在一个应用角度进行容器通信。

a.查看docker网桥配置
docker network ls
b.创建自定义网段
    docker create ems(网桥名称) ===> docker create -d bridge ems(网桥)
    docker run -d -p 8081:8080 --network ems(网桥名称) --name 名称 镜像名:tAG
    注意:一旦在启动容器时指定了网桥之后,日后可以在任何这个网桥关联的容器中使用容器名进行与其他容器通信
    curl http://容器名:端口
c.删除网桥
docker network rm 网桥名称
d.查看网桥详细
docker inspect ems(网桥名)

注意:使用docker run 指定--network 网桥时网桥必须存在

数据卷

1.数据卷的作用
用来实现容器与宿主机之间数据共享
2.数据卷特点

a.数据卷可以在容器之间共享和重用
b.对数据卷的修改会立即影响到对应容器
注意:可以设置容器内部只读,不改变外部宿主机数据卷
docker run -d -p 8080:8080 --name 容器名 -v 数据卷名:容器内的目录:ro 镜像:tag/镜像id   -->ro表示容器内目录只读
c.对数据卷的更新修改不会影响到镜像
d.数据卷默认不会一直存在,即使容器被删除

3.数据卷操作

1.自定义数据卷目录
docker run -v 绝对路径:容器内路径
2.自动创建数据卷
docker run -v 卷名(随机起的自动创建): 容器内路径

4.docker操作数据卷指令

a.查看数据卷
docker volume ls
b.查看某个数据卷的细节
docker volume inspect 数据卷名
c.创建数据卷
docker volume create 卷名
d.删除没有使用的数据卷
docker volume rm 卷名
docker volume prune

docker安装常用软件

安装mysql

1.去docker hub搜索对应服务的镜像
2.点击进入该服务docker hub
查看该服务的描述和版本信息
3.确定使用的版本
docker pull mysql:5.7.32
4.下载完使用镜像
    a.基本启动mysql服务
    docker run -e MYSQL_ROOT_PASSWORD=密码 镜像名:tag
    -e MYSQL_ROOT_PASSWORD=   代表给root用户指定密码
    b.启动一个mysql服务 后台运行,指定用户密码,指定容器名
    docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7.32
    c.启动一个mysql服务,后台运行,指定root用户密码,指定容器名,使用数据卷持久化到宿主机
    注意:通过docker hub 描述得知mysql存储数据文件目录放在容器这个目录/var/lib/mysql
    docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql -v mysqldata:/var/lib/mysql mysql:5.7.32
    d.启动一个mysql服务 后台运行 指定root用户密码指定容器名,使用数据卷持久化,已修改之后的配置文件启动
    docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql mysql:5.7.32

安装tomcat

1.下载tomcat服务
docker pull tomcat:8.0-jre8
2.启动tomcat服务
    a.启动一个基本的tomcat服务
    docker run -d -p 8081:8080 --name tomcat:8.0-jre8
    b.将部署应用目录通过数据卷挂载宿主机系统
    注意:部署web应用在容器中目录为 /usr/local/tomcat/webapps  配置文件/usr/local/tomcat/conf
    docker run -d -p 8081:8080 --name tomcat -v apps:/usr/local/tomcat/webapps tomcat:8.0-jre8
    c.修改配置文件,并将应用目录通过数据卷挂载到宿主机系统
    注意修改配置后,要重新启动一个容器(改端口的restart后改端口用不上),原正在运行容器可能不生效
    docker run -d -p 8081:8080 --name tomcat -v apps:/usr/local/tomcat/webapps -v confs:/usr/local/tomcat/conf tomcat:8.0-jre8

安装redis

1.下载redis服务
docker pull redis:5.0.10
2.启动redis服务
    a.启动基本的redis服务
    docker run -d -p 6379:6379 --name redis redis:5.0.10
3.开启redis持久化
docker run -d -p 6379:6379 --name redis redis:5.0.10 redis-server --appendonly yes
注意:一旦开启持久化之后,持久化生成aof文件会被放入容器/data目录中
docker run -d -p 6379:6379 --name redis -v redisdata:/data redis:5.0.10 redis-server --appendonly yes
4.修改redis配置文件,以配置文件启动
注意:在绝对路径中需要存在redis.conf文件
docker run -d -p 6379:6379 -v 绝对路径:/usr/local/etc/redis --name myredis redis:5.0.10 redis-server /usr/local/etc/redis/redis.conf

安装es和kibana

es
1.下载es服务
docker pull elasticsearch:6.8.0
2.运行镜像
docker run -d -p 9200:9200 -p 9300:9300 --name  elasticsearch elasticsearch:6.8.0
启动如果出现以下错误:
    max virtual memory areas vm.max_map_count is too low...
    解决方案:
    1.在虚拟机中,修改配置sysctl.conf
    vim /etc/sysctl.conf
    2.加入下面的配置
    vm.max_map_count=262144
    3.启动配置
    sysctl -p
3.访问esweb地址
http://....:9200
4.es持久化方案
注意:es中所有数据都在容器中/usr/share/elasticsearch/data
docker run -d --name es -p 9200:9200 -p 9300:9300 -v esdata:/usr/share/elasticsearch/data -v esconfig:/usr/share/elasticsearch/config elasticsearch:6.8.0
5.es持久化 该配置 安装ik分词器
docker run -d --name es -p 9200:9200 -p 9300:9300 -v esdata:/usr/share/elasticsearch/data -v esconfig:/usr/share/elasticsearch/config -v esplugins:/usr/share/elasticsearch/plugins elasticsearch:6.8.0
然后进入宿主机esplugins的目录。创建ik(随便什么名)目录然后装入ik插件
    https://download.csdn.net/download/LSY929981117/12625373
kibana
1.下载kibana
注意版本要和es对应
docker pull kibana:6.8.0
2.运行kinaba
    a.简单的启动kibana
    docker run -d --name kibana -p 5601:5601 kibana:6.8.0
    b.启动kinaba并连接到es
    docker run -d --name kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://....:9200 kibana:6.8.0
3.kibana加载配置文件启动
docker run -d --name kibana -p 5601:5601 -v kibanaconf:/usr/share/kibana/config kibana:6.8.0
注意:日后可以在kibanaconf数据卷所在目录中加入kibana

Dockerfile

介绍

1.什么是Dockerfile
定义:镜像构建文件/描述文件,用来帮助我们自己构建一个自定义镜像
2.为什么要存在Dockerfile
问题:在dockerhub官方提供很多镜像已经能够满足我们的所有服务了,为什么还需要自定义镜像
作用:日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行。
3.Dockerfile 构建镜像原理
image
4.Dockerfile使用
官方说明:https://docs.docker.com/engine/reference/builder/

常用命令:

保留字作用
FROM当前镜像是基于哪个镜像 第一个指令必须是FROM
RUN构建镜像时需要运行的指令
EXPOSE当前容器对外暴露的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝镜像且ADD命令会自动处理URL和解压tar包
COPY类似于ADD 拷贝文件和目录到镜像中
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令,当有多个CMD命令时,只有最后一个生效
ENTRYPOINT指定一个容器启动时要运行的命

基于Dockerfile构建镜像:docker build -t 镜像名:tag .
案例:

1.FROM <image>
FROM <image>[:<tag>]
FROM <image>[@<digest>]
2.RUN <command> (shell from,the command is run in a shell)
RUN echo hello
RUN ['executable','param','param2']
RUN ['/bin/nash','-c','echo hello']
3.EXPOSE 80/tcp
EXPOSE 80/udp
4.ENV <key> <value>
ENV <key>=<value>
5.WORKDIR 容器内的目录

Dockerfile构建springBoot项目

1.开发完整的boot应用    
2.对boot应用程序进行打包    
    war 过渡   ===》tomcat
    jar 主流   ===》jdk
3.打包项目
xxx.jar
4.在服务中创建dockerfile上下文目录 context
    a.mkdir demo  这个目录作为context目录
    b.在demo目录中创建Dockerfile
    c.上传应用jar包到context目录
    d.编写dockerfille
        FROM openjdk:8-jre
        WORKDIR /app
        ADD xxx.jar  yy.jar  //可改名
        EXPOSE 8081
        ENTRYPOINT ["java","-jar"]
        CMD yy.jar
    e.执行构建 
        docker build -t demo:01
    f.运行容器

idea安装docker

安装docker插件 重启idea 并新建dockerfile ,注意文件显示格式,如果是普通文件,则检查file type中文件格式,没有则重启再试或者手动强制更改格式至docker标识 然后通过tools中建立连接

Docker compose

介绍

1.什么是Docker compose
负责实现对docker容器集群的快速编排
2.compose定位
定义和运行多个docker容器应用,同时可以对多个容器进行编排
3.compose核心概念
服务:一个应用的容器;服务可以存在多个
项目:由一组关联的应用容器组成的一个完整的业务单元,在docker-compose.yml 文件中定义
4.compose使用

a.下载docker-compose
    curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-'uname -s'-'uname -m' > /usr/local/docker-compose
    sudo chomd +x /usr/local/bin/docker-compose
b.安装下载的docker-compose放入/usr/local/bin/并修改名为docker-compose
    1.mv docker-compose.xxxx docker-compose
    2.mv docker-compose /usr/local/bin/docker-compose
    3.chomd +x /usr/local/bin/docker-compose

5.检测compose是否安装成功
docker-compose -v

入门命令

第一个compose程序
a.创建一个docker-compose.yml文件
b.在配置文件中定义一个项目存在哪些服务
    version: "3.0"
    services: 
        tomcat: //服务名
            image:  tomcat:8.0-jre8 //创建当前这个服务使用的镜像
            ports:
                -8080:8080
c.运行docker-compose
docker-compose up 启动这个项目的所有服务 必须保证运行这个命令的目录存在docker-compose.yml
命令

1.build 指令
作用:用来将指定dockerfile打包成对应镜像,然后再运行该镜像。

services:
    demo:
        build:
            context: demo //dockerfile所在目录
            dockerfile: Dockerfile
        container_name: demo
        port: - "8081:8081"
        networks: - hello

2.其他指令见命令模板及总结

命令模板
version: "3.0"
    services: 
        tomcat:
            container_name: tomcat01  //相当于run --name
            image:  tomcat:8.0-jre8   //相当于run image
            ports:    //相当于run -p
                - "8080:8080" 
            volumes:   //相当于run -v
                - tomcatapps:/usr/local/tomcat/webapps
            network:   //相当于run --network
                - hello
            depends_on: //表明这个
                - mysql
                - redis
        mysql:
            image:  mysql:5.7.32
            container_name: mysql
            ports:
                - "3306:3306"
            volumes:
                - mysqldata:/var/lib/mysql
                - mysqlconf:/etc/mysql
            #environment:
                #- MYSQL_ROOT_PASSWORD
            env_file: #用来将environment环境中配置放入指定配置文件中
                - mysql.env
            network:
                - hello
            healthcheck: //健康心跳检查
                test: ["CMD","curl","-f","http://"]
                interval: 1m30s
                timeout: 10s
                retries: 3
        tomcat02:
            container_name: tomcat02  //相当于run --name
            image:  tomcat:8.0-jre8   //相当于run image
            ports:    //相当于run -p
                - "8080:8080" 
            volumes:   //相当于run -v
                - tomcatapps:/usr/local/tomcat/webapps
            network:   //相当于run --network
                - hello
            sysctls: //修改容器中系统内部参数,不是必须的 看具体的服务,有的应用需要修改系统参数
                - net.core.somaxconn=1024
                - net.ipv4.tcp_syncookies=0
            ulimits:  //修改容器中内部进程数范围
                npros:65535
                nofile:
                    soft:20000
                    hard:40000
volumes:  #声明上面容器所使用的卷名
    tomcatapps: #声明卷名
        external: true  #使用指定名称,但是在启动之前必须手动创建
    mysqldata:
    mysqlconf
network: #定义服务用到网桥
    hello: # 定义服务用到的网桥名称,默认创建的就是bridge
    external: true  #使用指定网桥,但是在启动之前必须存在
模板总结

image

compose指令

1.区别
模板命令:用来书写docker-compose.yml文件中成为模板命令,用来为服务进行服务的
指令:用来对整个docker-compose.yml对应的这个项目操作 书写docker-compose命令之后的命令 如 docker-compose up

2.常用指令
执行docker-compose [COMMAND] --help 可以查看具体某个命令的使用格式
命令选项

-f 指定使用的compose模板文件
-p 指定项目名称
--x-networking 使用Docker的可插拔网络
--x-network-driver 指定网络后端的驱动
--version 输出更多调试信息
-v 打印版本并退出

介绍

1.up
    格式 docker-compose up [options] [service]
将尝试自动完成包括构建,重启(创建)服务,启动服务,并关联服务相关容器的一系列操作
连接的服务将会被自动启动,除非已经处于运行状态
加上 -d 表示将会在后台启动并运行所有容器
2.down
将会停止up命令所启动的容器,并移除网络
3.exec
进入指定的容器
4.ps
列出docker-compose运行的所有容器
-q 表示只显示id
5.restart
用来重启项目中某个服务如果不写服务id 默认重启所有的服务
6.rm
用来删除项目服务
docker-compose rm -fv [服务id]  强制删除服务的数据
7.start/stop [服务id] 启动/关闭服务 docker-compose start/stop
8.top 用来查看各个服务容器内运行的进程
9.unpause docker-compose unpause 服务id 恢复处于暂停状态的进程
10.pause docker-compose pause 服务id
11.docker-compose log 服务id 查看服务日志

可视化工具

安装portainer

1.下载
    docker pull portainer/porttainer
2.启动portainer
    docker run -d -p 8000:8000 -p 9000:9000 -name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
3.通过compose启动
    portainer:
        image: portainer/portainer
        container_name: portainer
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - portainer_data:/data portainer/portainer
        network:
            - hello
        ports:
            - "8000:8000"
            - "9000:9000"
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值