虚拟机技术 vs Docker

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,在这之上安装运行软件
  • 容器的应用直接运行在宿主内,没有自己的内核,也没有虚拟我们的硬件,所以轻便了
  • 每个容器相互隔离,每个容器内都有自己的文件系统

优点:

  1. 更快的交付和部署

传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行

  1. 便捷的升级和扩缩容

部署应用如同搭积木,项目打包成一个镜像,可以扩展到各个服务器

  1. 更简单的运维系统

在容器化之后,开发测试环境都是高度一致

  1. 更高效的计算资源利用

Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例

名词解析

  • 镜像(image):docker镜像好比一个模板,通过这个模板来创建容器服务,通过这个镜像可以创建多个容器
  • 容器(Container):Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建的,可以理解为一个简易的linux
  • 仓库(repository):存放镜像的地方,分为私有和公有仓库
  • Docker Damon: dockerd,用来监听 Docker API 的请求和管理 Docker 对象,比如镜像、容器、网络和 Volume。
  • Docker Client: docker client 是我们和 Docker 进行交互的最主要的方式方法,比如我们可以通过 docker run 命令来运行一个容器,然后我们的这个 client 会把命令发送给上面的 Dockerd,让他来做真正事情。
  • Docker Registry:用来存储 Docker 镜像的仓库,Docker Hub 是 Docker 官方提供的一个公共仓库,而且 Docker 默认也是从 Docker Hub 上查找镜像的,当然你也可以很方便的运行一个私有仓库,当我们使用 docker pull 或者 docker run 命令时,就会从我们配置的 Docker 镜像仓库中去拉取镜像,使用 docker push 命令时,会将我们构建的镜像推送到对应的镜像仓库中。

image.png

安装

。。。。。。。

Docker常用命令

帮助命令

  1. docker verison # 显示docker版本信息
  2. docker info # 显示docker系统信息
  3. docker 命令 --help # 帮助命令

镜像命令


查看主机上的镜像

  1. #
  2. [root@izuf65mhum14tjzqrobqrsz ~]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. hello-world latest d1165f221234 2 months ago 13.3kB
  5. # 可选项
  6. -a, --all # 列出所有镜像
  7. -q, --quiet # 只列出镜像id

搜索容器

  1. [root@izuf65mhum14tjzqrobqrsz ~]# docker search mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation 10842 [OK]
  4. mariadb MariaDB Server is a high performing open sou 4091 [OK]
  5. mysql/mysql-server Optimized MySQL Server Docker images. Create 800 [OK]
  6. # 可选项,通过搜索过滤
  7. --filter=STARS=3000 #START大于3000的

下载镜像

  1. # 下载镜像 docker pull 镜像名 [:tag]
  2. [root@izuf65mhum14tjzqrobqrsz ~]# docker pull mysql
  3. Using default tag: latest # 不写tag默认latest
  4. latest: Pulling from library/mysql
  5. f7ec5a41d630: Pull complete # 分层下载,docker image的核心,联合文件系统
  6. 9444bb562699: Pull complete
  7. 6a4207b96940: Pull complete
  8. 181cefd361ce: Pull complete
  9. 8a2090759d8a: Pull complete
  10. 15f235e0d7ee: Pull complete
  11. d870539cd9db: Pull complete
  12. 493aaa84617a: Pull complete
  13. bfc0e534fc78: Pull complete
  14. fae20d253f9d: Pull complete
  15. 9350664305b3: Pull complete
  16. e47da95a5aab: Pull complete
  17. Digest: sha256:04ee7141256e83797ea4a84a4d31b1f1bc10111c8d1bc1879d52729ccd19e20a
  18. Status: Downloaded newer image for mysql:latest
  19. docker.io/library/mysql:latest # 真实地址

删除镜像

docker rmi -f 镜像id ...         # 删除制定的镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像

容器命令

说明:我们有了镜像才可以创建容器
`docker pull centos


新建容器并启动

docker run [可选参数] image

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

[root@izuf65mhum14tjzqrobqrsz ~]# docker run -it centos /bin/bash
[root@6b215ff1a432 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 退出
exit
Ctrl + P + Q # 容器不停止退出

列出所有的运行容器

docker ps       # 列出当前正在运行的容器
docker ps -a    # 列出当前正在运行的容器,带出历史运行过的容器
docker ps -n=?  #    显示最近创建的容器
docker ps -q    # 只显示容器编号

删除容器

docker rm 容器id      # 删除指定容器
docker rm -f $(docker ps -aq)  # 删除所有容器,包括正在进行的

启动和停止容器

docker start 容器id     # 启动容器
docker stop 容器id      # 停止当前运行容器
docker restart 容器id   # 重启容器
docker kill 容器id      # 强制停止

常用其他命令


后台启动容器

# 命令 docker run -d 镜像名
docker run -d centos
发现centos停止
docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有就会停止

查看日志

[root@ ~]# docker run -d centos /bin/sh -c "while true; do echo helloWorld; sleep 1; done"
d8df7e2b197acf010c1e76b1f13c82a4b73f8411a510221678476ae58368331e

[root@ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
d8df7e2b197a   centos    "/bin/sh -c 'while t…"   6 seconds ago   Up 6 seconds             condescending_dirac

docker logs -t -f d8df7e2b197a
2021-05-09T15:16:56.213965958Z helloWorld
2021-05-09T15:16:57.217005415Z helloWorld
2021-05-09T15:16:58.220298597Z helloWorld
2021-05-09T15:16:59.223080338Z helloWorld
2021-05-09T15:17:00.225780271Z helloWorld
2021-05-09T15:17:01.228778258Z helloWorld
2021-05-09T15:17:02.232387663Z helloWorld
...

查看容器中的进程信息

# docker top 容器id

查看镜像的元素数据

# docker inspect 容器id

进入正在运行的容器

# 我们通常容器在后台方式运行,需要进入容器,修改一些配置

方式一:进入容器开始一个新的终端,可以在里面操作
# docker exec -it 容器id bashShell
docker exec -it dc48sdjlwq /bin/bash 

方式二:进入容器正在执行的终端,不会启动新的进程
# docker attach 容器id

从容器上拷贝到主机上

docker cp 61d070035384:/home/hello.java /home/hqw/Documents/Java/