前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker入门

Docker入门

作者头像
收心
发布2022-01-19 14:28:16
2460
发布2022-01-19 14:28:16
举报
文章被收录于专栏:Java实战博客Java实战博客

时间: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的痛苦。

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • 常见命令
  • Docker安装
  • Docker为什么比虚拟机快
  • Docker 概念
    • 镜像是什么?
      • Docker 镜像加载原理
        • Docker常用命令
          • 镜像命令
            • 安装Mysql案例 & 详解:
              • 删除镜像
              • 容器命令
                • 案例 Docker 安装CentOS
                  • 常用命令
                  • 常见的坑 docker容器后台运行 必须要有一个前台进程,docker发现没有应用,就会自动停止  
                  • nginx 容器启动后 发现自己没有提供服务,就会立刻停止,就是没有程序了
                  • 自己写shell脚本
                    • 进入正在运行的容器
                    • 容器我们通常都是后台运行的,需要进入容器,修改一些配置
                      • 对比:
                        • 将容器内拷贝到主机上
                        • 上手实验 部署Nginx
                        • 部署Tomcat (切换镜像加速下载快)
                        • 部署ElastcSearch + Kibana
                        • 可视化 portainer(暂时使用这个 读音 pro Ti na)
                        • 将 容器 变成 镜像
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档