Docker学习篇(一)Docker概述、安装和常用命令

Docker概述

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间隔离,相互之间不会有任何接口。Docker是一种容器化技术。

Docker为什么出现

在没有Docker之前,开发环境、测试环境、生产环境(指的不是应用的环境,而是服务器的配置环境,比如系统,内核,配置等)的不同,可能导致某个应用在开发环境下能够成功运行,在测试和生产环境下就运行不了,使得开发和运维的压力会变大。

比如传统的java项目开发和部署流程:
开发人员进行应用的开发,开发完后,打成jar包或者war包,由运维人员部署到测试环境和生产环境上。还有服务器的环境配置也十分地繁琐,如果要配置的服务器数量比较大的话,那就变得十分艰难。

用了Docker后:开发打包部署上下一条龙做完。
java — jar — 打包(jar包加上必要的环境一起打包成一个Docker镜像)----上传到Docker仓库-----运维人员直接下载我们上传的镜像--------直接运行。

Docker的特性

相比于虚拟机,Docker是十分的轻巧的,可以在秒级别内启动。
在容器技术出来之前,我们使用的都是虚拟机技术。

虚拟机:比如我们在Windows系统中装一个VMware,通过这个软件我们可以虚拟出一台至多台电脑,十分笨重。
虚拟机是一种虚拟化技术,容器化也是一种虚拟化技术。

VM虚拟机:比如linux centos 原生镜像(可以看作一台电脑),如果要隔离,需要开启多台虚拟机。

虚拟机技术:
在这里插入图片描述
底层是内核,然后是一些依赖库,然后上层是众多的应用。
缺点:

  • 资源占用十分多,因为要虚拟一整台计算机出来。包括硬件。
  • 冗余步骤多。
  • 启动很慢。

Docker:

在这里插入图片描述
容器化技术不是模拟一个完整的操作系统。没有自己的内核,没有虚拟硬件等。容器之间是隔离的。

Docker与虚拟机的比较:

  • 传统虚拟机虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装运行软件应用。
  • 容器内的应用直接运行在宿主机上,容器没有自己的内核,也没有虚拟硬件,所以十分轻便。
  • 每个容器都是相互隔离的,每个容器内都有自己的一套文件系统,互不干扰。

Docker的优点:

  • 应用更快速的交付和部署。打包镜像发布测试,一键运行。
  • 更快捷的升级和扩容,使用docker之后,我们部署应用就和搭积木一样,项目打包成一个镜像,然后运行。
  • 更简单的系统运维,在使用Docker之后,我们的开发、测试生产环境都是高度一致的。
  • 更高效的计算资源利用,Docker是内核级别的虚拟化。

Docker架构

在这里插入图片描述

Docker是以Client-Server模式为我们提供服务的,我们通过下载安装服务器程序和客户端程序,并启动服务程序,然后客户端通过发送命令来操作服务程序,达到使用Docker的目的。
基本模式是客户端通过发送命令操作服务端程序从镜像仓库里面拉取镜像到本地,再运行成容器。

镜像

docker的镜像就好比一个模板,可以通过这个模板创建容器服务并运行,比如tomcat镜像->run->tomcat01容器,tomcat镜像->run->tomcat02容器,通过这个镜像可以创建多个容器,最终的服务(比如tomcat就是在容器中运行的)。镜像可以看作一个软件包及其依赖环境的打包。

容器

Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的,目前可以把这容器理解为一个建议的linux系统。

仓库

仓库就是存放镜像的地方,分为公有仓库和私有仓库,公有仓库比如Docker Hub,阿里云仓库等,私有仓库是你创建的仓库。

Docker安装并设置阿里云镜像加速

https://blog.csdn.net/qq_40837310/article/details/108094705

命令

完整命令:
官网文档:https://docs.docker.com/reference/

docker --help  #使用该命令也可以查看docker支持的命令
docker run --help  #可以查看docker run 命令的详细参数情况。

以下指示列举一些常用的基本命令,一些常用的高级命令后面说,一些不是很常用的命令可以用到时查官网

镜像相关命令
docker images    //查看所有本地主机上的镜像

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

解释:
REPOSITORY  镜像的仓库源(镜像名),就是用该名字进行镜像的拉取。
TAG    镜像的版本标签,latest是最新版。
IMAGE ID   镜像的id,这其实只是头部的部分id,还有一部分没有展示出来。
CREATED   镜像的创建时机。
SIZE   镜像的大小。

参数:
-q  只展示IMAGE ID。
-a  展示所有镜像。

[root@localhost ~]# docker  images -aq
bf756fb1ae65

docker pull 镜像名[:tag]   #下载镜像到本地,可以指定下载的版本,如果不指定,默认下载最新版。

#下载mysql镜像,默认下载最新版
[root@localhost ~]# docker pull mysql
Using default tag: latest   #默认下载最新版
latest: Pulling from library/mysql
bf5952930446: Pull complete  #这是docker的分层文件系统,将镜像分层,可以达到共用镜像的重复使用,节省空间。
8254623a9871: Pull complete 
938e3e06dac4: Pull complete 
ea28ebf28884: Pull complete 
f3cef38785c2: Pull complete 
894f9792565a: Pull complete 
1d8a57523420: Pull complete 
6c676912929f: Pull complete 
ff39fdb566b4: Pull complete 
fff872988aba: Pull complete 
4d34e365ae68: Pull complete 
7886ee20621e: Pull complete 
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest   
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              0d64f46acfd1        2 weeks ago         544MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

#下载mysql5.7
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists    #docker使用分层文件系统达到镜像的共用,这个Already exists的镜像是上面下载最新版mysql时已经下载好了,这里就不重新下载,达到共用,节省空间。
8254623a9871: Already exists 
938e3e06dac4: Already exists 
ea28ebf28884: Already exists 
f3cef38785c2: Already exists 
894f9792565a: Already exists 
1d8a57523420: Already exists 
5f09bf1d31c1: Pull complete 
1b6ff254abe7: Pull complete 
74310a0bf42d: Pull complete 
d398726627fd: Pull complete 
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 718a6da099d8        2 weeks ago         448MB
mysql               latest              0d64f46acfd1        2 weeks ago         544MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB


docker rmi 镜像Id1 镜像id2...    #删除指定镜像,如果镜像有被容器使用着(不管容器有没有启动),就会删除失败。可以删除多个,用空格隔开。
docker rmi -f 镜像ID   #删除指定镜像,加了-f参数表示强制删除,不管有没有被容器使用着。
docker rmi -f $(docker images -qa)  #删除所有镜像,因为docker images -qa返回的是所有镜像的id。


[root@localhost ~]# docker images  #查看镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 718a6da099d8        2 weeks ago         448MB
mysql               latest              0d64f46acfd1        2 weeks ago         544MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB
[root@localhost ~]# docker rmi 718a6da099d8  #删除mysql5.7镜像
Untagged: mysql:5.7  #删除成功
Untagged: mysql@sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Deleted: sha256:718a6da099d82183c064a964523c0deca80619cb033aadd15854771fe592a480
Deleted: sha256:058d93ef2bfb943ba6a19d8b679c702be96e34337901da9e1a07ad62b772bf3d
Deleted: sha256:7bca77783fcf15499a0386127dd7d5c679328a21b6566c8be861ba424ac13e49
Deleted: sha256:183d05512fa88dfa8c17abb9b6f09a79922d9e9ee001a33ef34d1bc094bf8f9f
Deleted: sha256:165805124136fdee738ed19021a522bb53de75c2ca9b6ca87076f51c27385fd7
[root@localhost ~]# docker rmi bf756fb1ae65 #删除hello-world镜像
Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is being used by stopped container b04a1257aa83  #删除失败,因为该镜像被id为b04a1257aa83的容器使用着
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              0d64f46acfd1        2 weeks ago         544MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB
[root@localhost ~]# docker ps -a #查看所有容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
b04a1257aa83        hello-world         "/hello"            20 hours ago        Exited (0) 20 hours ago                       gallant_cray
[root@localhost ~]# docker rmi -f bf756fb1ae65 #加上-f强制删除,删除成功。
Untagged: hello-world:latest
Untagged: hello-world@sha256:7f0a9f93b4aa3022c3a4c147a449bf11e0941a1fd0bf4a8e6c9408b2600777c5
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b

容器命令

要玩容器命令,首先要有镜像。先下载个centos7镜像。

[root@localhost ~]# docker pull centos:7
7: Pulling from library/centos
75f829a71a1c: Pull complete 
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   7e6257c9f8d8        8 days ago          203MB

docker run [可选参数] image   #新建容器并启动
参数:
--name="name"  #指定容器的名字,比如--name=nginx1,用来区分容器。
-d     #后台方式运行
-it    #使用交互方式运行,进入容器查看内容
-p     #指定容器的端口
		-p 主机ip:主机端口:容器端口  #通过ip:主机端口  映射到容器的端口,也就是访问ip:hostPort就是访问容器端口。
		-p 主机端口:容器端口  #主机端口映射容器端口,常用。
		-p 容器端口  #直接指定容器端口

-P     #大写P,随机指定端口

[root@localhost ~]# docker run -it 7e6257c9f8d8 /bin/bash  #创建、启动并进入容器的bash界面
[root@43a1536b35d2 /]# ls  #此时已经进入了容器的环境里,这个文件系统是容器的文件系统
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@43a1536b35d2 /]# exit  #退出并停止容器
exit
[root@localhost ~]# ls  #回到操作系统的bash界面。
anaconda-ks.cfg  initial-setup-ks.cfg
[root@localhost ~]# 
docker ps [参数]  # 不带参数,就是查看运行中的容器
参数:
-a   #列出当前正在运行的容器 + 历史运行过的容器
-n=? # 显示最近创建的n个容器
-q   #只显示容器编号


[root@localhost ~]# docker ps  #查看运行中的容器,并没有
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker ps -a  #查看运行中的容器+历史运行过的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
43a1536b35d2        7e6257c9f8d8        "/bin/bash"         13 minutes ago      Exited (0) 12 minutes ago                       amazing_northcutt
b04a1257aa83        bf756fb1ae65        "/hello"            21 hours ago        Exited (0) 21 hours ago                         gallant_cray

解释:
CONTAINER ID  #容器Id
IMAGE  #容器是使用哪个镜像来创建的,镜像Id。
COMMAND #启动容器时使用的命令
CREATED  #容器的创建时机
STATUS  #容器的状态向第一条记录表示 容器在12分钟前停止了。
PORTS   #容器启动的端口。
Names   #容器的名字

exit  #停止并退出容器
Ctrl + P + Q   #容器不停止的情况下进行退出

[root@localhost ~]# docker run -it --name=centos1 7e6257c9f8d8 /bin/bash 
[root@a7d8021101b4 /]# exit  
exit
[root@localhost ~]# docker ps  #使用exit命令退出后,容器也停止了,所以使用docker ps没有正在运行的润过期
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@localhost ~]# docker run -it --name=centos2 7e6257c9f8d8 /bin/bash 
[root@6f2f4f7e921d /]# [root@localhost ~]# 
[root@localhost ~]# docker ps  #使用Ctrl + P + Q  #退出容器,但是不停止,所以docker ps能查到正在运行的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6f2f4f7e921d        7e6257c9f8d8        "/bin/bash"         19 seconds ago      Up 18 seconds                           centos2
docker rm 容器Id   #删除指定容器,不能删除正在运行的容器。如果要强制删除,使用docker rm -f 容器Id。
docker rm -f $(docker ps -aq) #强制删除所有容器
docker start 容器Id  #启动容器
docker restart 容器Id #重启容器
docker stop   容器Id  #正常停止容器
docker kill 容器Id  #强制停止容器

[root@localhost ~]# docker stop 6f2f4f7e921d
6f2f4f7e921d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker start 6f2f4f7e921d
6f2f4f7e921d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6f2f4f7e921d        7e6257c9f8d8        "/bin/bash"         11 minutes ago      Up 2 seconds                            centos2

其他常用命令

后台启动容器:

docker run -d 镜像Id 

[root@localhost ~]# docker run -d 7e6257c9f8d8
7a1da4d958ca78758214e78b5b65750bbdf58a435ebbc7fd8fb4910bec609a8a
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

#后台启动后,用docker ps查看正在运行的容器,发现没有容器运行,原因是容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。

[root@localhost ~]# docker run -d 7e6257c9f8d8 /bin/bash -c "while true; do echo Yehaocong;sleep 1;done"     #后台启动容器,然后前台进程运行一段shell脚本,该脚本的意思是每隔一秒打印一个Yehaocong。
ae215cae04313e06261bbef34cc7e6117907276c7bcdad3533b8ca708b5c195f
[root@localhost ~]# docker ps #因为有前台进程,所以容器没有自动停止。
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ae215cae0431        7e6257c9f8d8        "/bin/bash -c 'while…"   5 seconds ago       Up 4 seconds                            wizardly_burnell

查看日志:

docker logs -ft --tail 查看日志的数量 容器id
[root@localhost ~]# docker logs -ft --tail 10 ae215cae0431
2020-08-19T08:03:13.298804702Z Yehaocong
2020-08-19T08:03:14.302972780Z Yehaocong
2020-08-19T08:03:15.304629340Z Yehaocong
2020-08-19T08:03:16.309076836Z Yehaocong
2020-08-19T08:03:17.311538438Z Yehaocong
2020-08-19T08:03:18.312577683Z Yehaocong
2020-08-19T08:03:19.313923148Z Yehaocong
2020-08-19T08:03:20.317581985Z Yehaocong
2020-08-19T08:03:21.318458318Z Yehaocong
2020-08-19T08:03:22.320476580Z Yehaocong
2020-08-19T08:03:23.322294054Z Yehaocong

查看容器中的进程信息:

docker top 容器id
[root@localhost ~]# docker top ae215cae0431
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                90039               90021               0                   15:53               ?                   00:00:00            /bin/bash -c while true; do echo Yehaocong;sleep 1;done
root                90975               90039               0                   16:04               ?                   00:00:00            sleep 1

查看容器元数据:

docker inspect 容器Id

进入当前正在运行的容器:

docker exec -it 容器Id  /bin/bash

[root@localhost ~]# docker exec -it a7d8021101b4 /bin/bash
[root@a7d8021101b4 /]# exit  #此时的退出不会停止容器
exit
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ae215cae0431        7e6257c9f8d8        "/bin/bash -c 'while…"   17 minutes ago      Up 16 minutes                           wizardly_burnell
a7d8021101b4        7e6257c9f8d8        "/bin/bash"              40 minutes ago      Up 21 seconds                           centos1

从容器拷贝文件到主机上

docker cp 容器id:要拷贝的文件的路径 拷贝到主机上的路径

[root@localhost ~]# docker exec -it a7d8021101b4 /bin/bash  #进入容器中
[root@a7d8021101b4 /]# cd /home/
[root@a7d8021101b4 home]# ls //文件路径为/home/aaa.txt
aaa.txt
[root@a7d8021101b4 home]# exit //退出
exit
[root@localhost ~]# docker cp a7d8021101b4:/home/aaa.txt . //拷贝到当前文件夹
[root@localhost ~]# ls #拷贝成功
aaa.txt  anaconda-ks.cfg  initial-setup-ks.cfg

在这里插入图片描述
上图示一张交互所需要的命令。


版权声明:本文为qq_40837310原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。