Docker入门

2022-01-19 14:28:16 浏览数 (1)

时间:2020年11月2日 Docker官网:https://www.docker.com/ 在线Docker实验室:https://labs.play-with-docker.com/ 需要自己注册账号 登录即可 帮助文档: https://docs.docker.com/ https://docs.docker.com/engine/install/centos/

准备工作

首先查看系统内核版本

代码语言:javascript复制
uname -r

然后查看系统版本

代码语言:javascript复制
cat /etc/os-release

常见命令

启动docker

代码语言:javascript复制
systemctl start docker

或者:docker restart

关闭docker

代码语言:javascript复制
systemctl stop docker

查看docker的运行状态

代码语言:javascript复制
systemctl status docker

Docker安装

先卸载docker 以及相关的所有内容

代码语言:javascript复制
sudo yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-engine

安装需要安装的安装包

代码语言:javascript复制
sudo yum install -y yum-utils

安装docker

代码语言:javascript复制
yum -y install docker // -y 是指不询问是否安装
代码语言:javascript复制
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun(自己提前安装的)

查看是否安装了docker

代码语言:javascript复制
docker version

安装docker引擎与容器

代码语言:javascript复制
sudo yum install docker-ce docker-ce-cli containerd.io

查看docker是否安装列表

代码语言:javascript复制
yum list installed | grep docker

设置docker开机自启动

代码语言:javascript复制
systemctl enable docker.service

更新软件包索引 

代码语言:javascript复制
yum makecache fast

安装后 配置阿里云镜像加速

代码语言:javascript复制
vi /etc/docker/daemon.json

里面添加:
{
"registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]
}

然后重新加载配置文件

代码语言:javascript复制
systemctl reload daemon

如果这个不行 切换这个
sudo systemctl daemon-reload

然后重启Docker

代码语言:javascript复制
systemctl restart docker
或者:docker restart

启动docker

代码语言:javascript复制
systemctl start docker

查看是否启动状态

代码语言:javascript复制
docker stats

测试docker

代码语言:javascript复制
docker run hello-world

查看下docker的镜像

代码语言:javascript复制
docker images

卸载docker

代码语言:javascript复制
sudo yum remove docker-ce docker-ce-cli containerd.io

卸载docker不会删除映像、容器、卷、自定义配置文件

要删除所有图像,容器和卷

代码语言:javascript复制
sudo rm -rf /var/lib/docker

自定义配置文件 需要手动删除

docker默认工作路径

代码语言:javascript复制
可以从docker info 查看Docker的系统信息

一般是这个位置:/var/lib/docker

docker run 镜像名 /bin/bash

选取本地查找镜像,有就运行,没有就远程dockerHUB中拉取,最后找到了就运行,找不到就报错

Docker为什么比虚拟机快

  1. docker比虚拟机更少的抽象层(跳过系统运行)
  2. 小巧、共用一套lib(用的是宿主机的内核,VM使用的是Guest OS)

所以说 新建一个容器的时候,docker不需要像虚拟机一样重新加载操作系统内核,避免引导,VM是加载GuestOS,分钟级别的,而docker使用的是宿主机内核,避免复杂的过程,更加的快。

Docker 概念

镜像是什么?

镜像是一种轻量级、可执行的独立软件包,它包含某个软件运行所需的所有内容

包括代码、运行时、库、环境变量、配置文件 等等

Docker 镜像加载原理

UnionFS(联合文件系统)

将镜像拆成一个个组件,每次下载镜像的时候,重复的组件,就不需要再次下载!

比如:完整Tomcat镜像需要centos镜像的某些文件,Mysql运行也需要,如果提前下载了centos的镜像,再下载tomcat、mysql等就不需要额外下载了。

当你删除某个容器的时候,某个组件被其他镜像所使用,删除就不会删除公用的部分。当最后一个使用公用组件的镜像删除时,此公共文件才会被同时删除!

Docker常用命令

代码语言:javascript复制
docker version          # 查看docker版本
docker info		# 查看更加详细系统的信息,包括镜像与容器的数量
docker --help	        # docker帮助

镜像命令

查看所有镜像

代码语言:javascript复制
docker images 
  • 展示列表所带来的含义
  • RESPOSITORY 镜像的仓库源
  • TAG 奖项的标签
  • IMAGE ID 镜像的ID
  • CREATED 镜像的创建时间
  • SIZE 镜像的大小
代码语言:javascript复制
docker images --help	# 查看镜像帮助
docker images -qa	# 查看所有镜像的ID

搜索命令:docker search 镜像Name

代码语言:javascript复制
例如:搜索MySql镜像
docker search mysql
代码语言:javascript复制
docker search --help
代码语言:javascript复制
# 查询DockerHub中 大于标星3000的Mysql
docker search mysql --filter=STARS=3000 

# 下载镜像 (tag代表版本,不写 默认就是latest)
docker pull tag  

# 下载最新版本的Mysql
docker pull mysql

docker pull --help

安装Mysql案例 & 详解:

代码语言:javascript复制
[root@localhost ~]# docker pull mysql
Using default tag: latest			# 使用默认的latest版本
latest: Pulling from library/mysql
bb79b6b2107f: Pulling fs layer 		  # 分层下载 docker images核心 联合文件系统
49e22f6fb9f7: Pull complete 
842b1255668c: Pull complete 
9f48d1f43000: Pull complete 
c693f0615bce: Pull complete 
8a621b9dbed2: Pull complete 
0807d32aef13: Pull complete 
a56aca0feb17: Pull complete 
de9d45fd0f07: Pull complete 
1d68a49161cc: Pull complete 
d16d318b774e: Pull complete 
49e112c55976: Pull complete 
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d    # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest		        # 下载的真实地址

得出结论:

代码语言:javascript复制
# 不指定tag
docker pull mysql  
# 等价于
docker pull docker.io/library/mysql:latest

指定版本下载(对比一下上面的案例分析)

代码语言:javascript复制
docker pull mysql:5.7
代码语言:javascript复制
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql	        //下面蓝色表注的 正是之前lastest版本的mysql
bb79b6b2107f: Already exists 
49e22f6fb9f7: Already exists 		//这里就体现出来docker文件系统优势
842b1255668c: Already exists 
9f48d1f43000: Already exists 
c693f0615bce: Already exists 
8a621b9dbed2: Already exists 
0807d32aef13: Already exists 
f15d42f48bd9: Pull complete 
098ceecc0c8d: Pull complete 
b6fead9737bc: Pull complete 
351d223d3d76: Pull complete 
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

删除镜

代码语言:javascript复制
docker rmi -f 镜像的id			# 删除指定id的镜像
docker rmi -f 镜像id 镜像id 镜像id 	# 删除多个指定id的镜像
docker rmi -f $(docker images -qa)	# 删除全部镜像

同样的道理 当有一个lastest 与5.7的mysql时候,删除mysql5.7的时候 不会全部删除mysql5.7 会先删除mysql5.7对比lastest版本独有的地方 当全部删除mysql时才会全部删除所有的共同部分

容器命令

代码语言:javascript复制
docker run [可选参数] 镜像名字

可选参数说明:

  • –name=”Name” 指定容器的名字
  • -d 后台方式运行
  • -it 使用交互方式运行,进入容器,可查看内容
  • -p 指定端口 例如-p 8080:8080
  • -p 主机端口:容器端口 (常用)
  • -p 容器端口
  • -p 主机ip:端口:容器端口

案例 Docker 安装CentOS

代码语言:javascript复制
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker run -it centos
[root@fc4e5fcea052 /]# ls
bin  dev  etc  home  lib  lib64  lost found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@fc4e5fcea052 /]# exit
exit
[root@localhost ~]# ls
anaconda-ks.cfg  Desktop  Documents  Downloads  Music  original-ks.cfg  Pictures  Public  Templates  Videos

对比一下 主机centos 与docker运行的centos 文件是不一样的

代码语言:javascript复制
docker ps  [参数]	        # 查看正在运行的docker容器
-a 				# 查看当前运行的容器,以及历史运行过的容器
-n=?				# 查看最近创建的容器 n代表几个
-q				# 查看容器的编号

退出容器

代码语言:javascript复制
exit				# 停止容器并退出
Ctrl   P   Q 			# 退出不停止容器

删除容器

代码语言:javascript复制
docker rm 容器id				#删除一个指定id的容器 不能删除运行中的容器
docker rm -f $(docker ps -aq)	                #删除所有容器 可以删除所有运行非运行的容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)   # 停止全部容器并删除,如果没有容器会报错

常用命令

代码语言:javascript复制
docker start 	容器id			#启动容器
docker resrart 	容器id			#重启容器
docker stop 	容器id			#停止容器
docker kill 	容器id			#杀死容器
docker -d       容器id                  #后台启动一个容器

常见的坑 docker容器后台运行 必须要有一个前台进程,docker发现没有应用,就会自动停止  

nginx 容器启动后 发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志命令
代码语言:javascript复制
docker logs [参数]
  • -t #显示时间
  • -f
  • –tail num #显示num条
  • –tail=num #显示num条
代码语言:javascript复制
# 容器mynginx从2016年7月1日后的最新10条日志。
docker logs --since="2016-07-01" --tail=10 mynginx
docker logs --since="2016-07-01" --tail 10 mynginx

自己写shell脚本

docker run -d centos /bin/sh -c “while true;do echo kuangshen;sleep 1;done”

docker logs -ft –tail 10 218

docker top 容器ID #查看容器运行情况

docker inspest 容器id #查看容器元数据

进入正在运行的容器

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

#命令

代码语言:javascript复制
方式1
docker exec -it 容器id /bin/sh

方式2
docker attach 容器id           #一旦写入死循环 你将出不来,不建议使用

对比:

  • exec 开启一个新的终端,可以在里面操作
  • 而attach是进入正在执行的终端

将容器内拷贝到主机上

代码语言:javascript复制
docker cp 容器id:/容器文件 主机位置

docker cp 容器id:/home/test.java /home 将容器内部的home下test.java 拷贝到主机上的home下 ,容器运不运行无关

未来可以可以使用数据卷的技术 实现自动同步

上手实验 部署Nginx

代码语言:javascript复制
docker search nginx --filter=Stars=3000      #建议去dockerhub 可以看到更多的信息

docker pull nginx

docker run -d --name nginx001 -p:公网端口:容器运行端口

#如果是本地测试的环境,需要开启本地服务器的防火墙,如果是云服务器,可能还要有安全组需要开放!
#干掉防火墙 就跑起来了
systemctl stop firewalld.service 

docker exec -it 镜像id /bin/bash

Whereis nginx

说明:如果使用的在线的网页版docker 再开一台实例即可,他们俩在一个网段,可以直接互通,代替公网访问!

查看到nginx后 可以进行修改配置文件,达到修改nginx配置文件,但是目前修改文件的命令,我们需要使用数据卷技术,来实现修改文件的目的,在Docker 高级中会讲解!

不过想看单独在此镜像的内容,请输入

代码语言:javascript复制
nginx -help

部署Tomcat (切换镜像加速下载快)

代码语言:javascript复制
# 拉取镜像
docker pull tomcat

# 用完即删除,一般用于做测试
docker run -it --rm tomcat

# 启动tomcat
docker run -d --name tomcat001 -p8080:8080 tomcat

curl 127.0.0.1:8080 #一定会看到404

# 发现镜像的tomcat的webapps里没有Root文件夹,所以无法查看相关web
docker exec -it 镜像id /bin/bash

# Root文件夹在 "webapps.dist"文件夹里面 复制到tomcat的webapp文件夹下 就可以访问了!
cp -r webapps.dist/ROOT webapps

curl 127.0.0.1:8080 #这次需要等待一会进入,就不再示404了

Ctrl   P   Q 退出

部署ElastcSearch Kibana

首先先去DockerHub 查找一下ElastcSearch:https://hub.docker.com/_/elasticsearch

#下载加启动ElastcSearch 注意,此命令敲后,内存会激增,ElasticSerarch大约被使用了1.28G了 但是Docker自身占用了内存也会变高。

代码语言:javascript复制
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#发现ElastcSearch有些卡

代码语言:javascript复制
#查看先Docker运行状态
docker stats

#查看ES 是否启动

代码语言:javascript复制
curl localhost:9200

#停止下search服务

代码语言:javascript复制
docker stop 镜像id

docker start 镜像id或名字 启动镜像

#增加内存对ES的限制 (这里要修改下名字,不然容器名字一样不允许)

代码语言:javascript复制
docker run -d --name elasticsearch002 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

其中加入的-e ES_JAVA_OPTS=”-Xms64m -Xmx512m” 表述的指定内存参数最小64M 最大512m 但是内存越小运行越慢。

#查看ES 是否启动

代码语言:javascript复制
curl localhost:9200

可视化 portainer(暂时使用这个 读音 pro Ti na)

Docker 图形化界面管理工具 镜像名就是:portainer/portainer

代码语言:javascript复制
docker run -d -p:8088:9000 --restart=always -v "/var/run/docker.sock:/var/run/docker.sock" --privileged=true portainer/portainer

既然提示让我们操作

那我们就按照指令操作

代码语言:javascript复制
docker run -d --name portainer -p:8088:9000  --restart=always -v "/var/run/docker.sock:/var/run/docker.sock" portainer/portainer

第一次需要注册一个账号即可。如果无法连接本地 请检查run 命令 最好自己重新打一遍!

直接访问 127.0.0.1:8088

将 容器 变成 镜像

代码语言:javascript复制
docker commit -m="提交的信息" -a="作者" 容器id 目标镜像名:tags

然后 docker images 就会出现了新的镜像了

到这里就是Docker 入门(精髓在下面) !

https://cloud.tencent.com/developer/article/1937239

特殊说明:

解决问题的光鲜,藏着磕Bug的痛苦。

万物皆入轮回,谁也躲不掉!

以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

0 人点赞