Docker学习

 


  • Docker概述

  • Docker安装

  • Docker命令

    • 镜像命令
    • 容器名利
    • 操作命令
    • 其他命令
  • Docker镜像

  • 容器数据卷

  • DockerFile

  • Docker网络原理

  • IDEA整合Docker

  • Docker Compose

  • Docker Swarm

  • CI\CD Jenkins

Docker概述


Docker为什么会出现?

首先看docker图标,鲸鱼背上驮着集装箱

img

假定您在开发一个电商项目,您使用的是一台笔记本电脑,而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。此外,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列的支持文件。您希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销。请问?

您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?

img

答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案----系统平滑移植,容器虚拟化技术。

举个例子:

在以前,开发人员只需要提交源代码(jar包等等)直接发给运维人员即可。然后,运维开始完成部署。会有三种情况让运维人员头疼。

第一种情况,部署环境问题。

运维在部署的时候会有很多环境问题:mysql版本、redis补丁、java版本(开发的时候是java8,生产的时候是java7,可能一些java8的新特性,根本无法使用)

第二种情况 ,安装过于繁琐。

运维因为环境问题导致各种软件版本不一样,这时候运维人员就会要求开发人员写一张list清单(环境配置表)。开发是什么环境,我运维就怎么配。那么问题来了:在多台集群的情况下。这时候运维就疯了,或许我的mysql是1主1从,装2台。redis是3主3从,装6台。运维稍微因为版本和环境配置,装错一步,可能系统就跑不起来了,大家只能互相扯皮,运维是非常非常痛苦的。

第三种情况,弹性发布太慢。

假设服务器不够用了,运维需要扩容、缩容,符合弹性的发布。redis是六台3主3从。现在环境并发量大了,需要马上扩容,变成4主4从,瞬间要求你起来两个实例,如果按照以前的安装步骤,你把运维逼疯,也不可能秒级别的把服务跑起来。

img

环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样复制过来,开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。

img

能不能把软件和环境打包成一个镜像文件给运维?

这时候就要用到docker引擎。开发过程所跑的环境和配置可以原封不动的移植过来,达到了环境的匹配和整合。

img

假设你在北京某小区,5号楼5单元朝北的屋子501室,找到工作后要搬家到上海,绝对不可能是同样的小区,同样的楼层,同样的户型。这时候你就要打包、解压、货拉拉搬家公司,搬过去,重新收拾,非常麻烦,而且还可能适应不了新环境。

用了docker以后,陆地航空母舰,类似于推土机直拔下去,连根基都搬起来,搬到另外一个地方,也就是直接搬楼,就没有上面述说的问题了。

也就是说,docker实现了从搬家到搬楼。

img

之前在服务器配置一个应用的运行环境,要安装各种软件,就拿某电商项目的环境来说,Java/ RabbitMQ/ MySQL/ JDBC等驱动包等。安装和配置这些东西有多麻烦就一一举例了,它还不能跨平台使用。假如我们在windows上安装的这些环境,到了Linux又得重新装,况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。

传统上认为,软甲编码开发/测试结束后,所产生的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让运维团队得以部署应用程式。开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker的出现使得Docker得以打破过去[程序及应用]的观念。通过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由上而下打包,达到应用程式跨平台的无缝运作。

 

Docker的安装


Docker组成

镜像(imager)

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run===>tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就在容器中的)。

容器(container) :

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

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

目前就可以把这个容器理解为一个简易的linux系统。

仓库(repository):

仓库就是存放镜像的地方!

仓库分为共有仓库和私有仓库!

Docker Hub(默认是国外的)

阿里云.......都有容器服务器(配置镜像加速!)

Docker下载安装

安装文档:https://docs.docker.com/engine/install/centos/

#1、卸载旧的Docker
sudo yum remove docker
                docker-client
                docker-client-latest
                docker-common
                docker-latest
                docker-latest-logrotate
                docker-logrotate
                docker-engine
                 
#2、需要的安装包
sudo yum install -y yum-utils

#3、设置镜像的仓库
sudo yum-config-manager
  --add-repo
  https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的
   

yum-config-manager
  --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用阿里云

#更新yum软件包索引
sudo yum makecache fast

#4、安装Docker相关文件
sudo yum install docker-ce docker-ce-cli containerd.io

#5、启动Docker
sudo systemctl start docker
docker version #查看docker是否安装启动成功

了解:卸载Docker

#1、卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io

#2、删除资源
sudo rm -rf /var/lib/docker #(默认工作路径)
sudo rm -rf /var/lib/containerd

 

Docker的常用命令


帮助命令

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

帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/

 

镜像命令


docker images 查看所有本地的主机上的镜像

[root@yang]docker images java
REPOSITORY         TAG                 IMAGE ID           CREATED             SIZE
java               8                   308e519aac60       6 days ago         824.5 MB

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

#可选项
--all , -a #列出所有镜像
--quiet , -q #只显示镜像的id

docker search 搜索镜像

[root@yang]docker search mysql

docker pull 下载镜像

[root@yang]docker pull debian
Using default tag: latest #如果不屑tag,默认就是latest
latest: Pulling from library/debian
fdd5d7827f33: Pull complete #分层下载,docker images的核心,联合文件系统
a3ed95caeb02: Pull complete
Digest: sha256:e7d38b3517548a1c71e41bffe9c8ae6d6d29546ce46bf62159837aad072c90aa
Status: Downloaded newer image for debian:latest

docker rmi删除镜像

[root@yang]docker rmi -f 【IMAGE ID】【REPOSITORY】                 #可以按id或名称指定删除
[root@yang]docker rmi -f 【IMAGE ID】【IMAGE ID】【IMAGE ID】   #删除多个镜像
[root@yang]docker rmi -f $(docker images -aq)   #删除全部镜像

 

容器命令


说明:有镜像才可以创建容器

#拉取下载镜像
[root@yang]docker pull centos

新建容器并启动

[root@yang]docker run 【可选参数】 image

#参数说明
--name="Name" 容器名字 tomcat01 tomcat02, 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口

#启动并进入容器
[root@yang]docker run -it centos /bin/bash

列出所有运行的容器

[root@yang]docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-q #只显示容器的编号

退出容器

[root@yang]exit	#直接容器停止并退出
[root@yang]ctr + p + Q #容器不停止退出

删除容器

[root@y
ang]docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
[root@yang]docker rm -f $(docker ps -aq) #删除所有的容器
[root@yang]docker ps -a -q | xargs docker rm #删除所有的容器

启动和停止容器的操作

[root@yang]docker start 容器id		#启动容器
[root@yang]docker restart 容器id #重启容器
[root@yang]docker stop 容器id #停止当前正在运行的容器
[root@yang]docker kill 容器id #杀掉(强制停止)正在运行的容器

 

常用的其他命令


后台启动容器

#命令 docker run -d 镜像名
[root@yang]docker run -d centos

#问题docker ps 发现centos停止了?

#常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
#nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了。

查看日志命令

#命令 docker logs 容器id
[root@yang]docker logs -tf --tail 10 容器id #显示10行日志

-tf #显示日志
--tail number #显示日志的条数

查看容器中进程信息

#命令 docker top 容器id
[root@yang]docker top 容器id

查看镜像的元数据

#命令 docker inspect 容器id
[root@yang]docker inspect 容器id

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置。

#方式一
[root@yang]docker exec -it 容器id /bin/bash

#方式二
[root@yang]docker attach 容器id /bin/bash
正在执行当前的代码......

#总结
#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)。
#docker attach #进入容器后到正在执行的终端,不会启动新的进程!

从容器内拷贝文件到主机上

#命令 docker  cp  容器id:路径/文件  要拷贝的路径
[root@yang]docker cp 容器id:/home/test.java /home

 

小结


posted @   迷路~麋鹿  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示