Docker 快速入门

转载申明:https://linux.cn/article-8932-1-rel.html

1 Docker 是什么?

Docker 是一个开源的容器引擎,而一个容器其实是一个虚拟化的独立的环境,因此开发者可以将应用打包到这样的一个 docker 容器中,然后发布到任何可以运行 docker 容器的机器中,实现一次打包多处部署,解决了因为环境问题而导致的部署难题。

1.1 容器是什么?

与 容器 对应的一个概念就是 镜像,镜像可以看做我们平时装系统的镜像,里面就是一个运行环境。当然我比较喜欢将镜像比作一个我们面向对象编程中的 类,而一个容器就是一个类的 实例,因此可以根据一个镜像,创建出很多个容器。每一个容器都是具体的,我们可以在容器上面做出更改,然后再把这个容器打包成一个新的镜像,从而以后可以根据改动后的镜像创建出新的容器。而容器本身可以简单理解为是一个虚拟独立的运行环境,我们要做的是中这个环境中打包我们的应用,以便于再次部署。

2 安装 Docker

Gentoo

 
  1. # emerge --ask docker

CentOS

 yum install docker-ce

Ubuntu

apt-get pacman S docker

2.1 启动 docker 守护进程

systemctl start docker

3 docker 命令介绍

  • docker help
  • 管理命令:
  • container 管理容器
  • image 管理镜像
  • network 管理网络
  • 命令:
  • attach 介入到一个正在运行的容器
  • build 根据 Dockerfile 构建一个镜像
  • commit 根据容器的更改创建一个新的镜像
  • cp 在本地文件系统与容器中复制文件/文件夹
  • create 创建一个新容器
  • exec 在容器中执行一条命令
  • images 列出镜像
  • kill杀死一个或多个正在运行的容器
  • logs 取得容器的日志
  • pause 暂停一个或多个容器的所有进程
  • ps列出所有容器
  • pull 拉取一个镜像或仓库到 registry
  • push 推送一个镜像或仓库到 registry
  • rename 重命名一个容器
  • restart 重新启动一个或多个容器
  • rm删除一个或多个容器
  • rmi 删除一个或多个镜像
  • run 在一个新的容器中执行一条命令
  • search DockerHub中搜索镜像
  • start 启动一个或多个已经停止运行的容器
  • stats 显示一个容器的实时资源占用
  • stop 停止一个或多个正在运行的容器
  • tag 为镜像创建一个新的标签
  • top 显示一个容器内的所有进程
  • unpause 恢复一个或多个容器内所有被暂停的进程
  • 在子命令中还有更多丰富的选项,可以使用 docker COMMAND --help 查看。例如:

     docker run help

    4 docker 使用实战

    接下来,我将利用 docker 部署一个 Nginx 服务器,作为讲解的例子。 要创建一个容器,那么我们必须先要有一个用于创建容器的镜像。 在 docker hub 中查找 nginx 相关镜像。

     docker search nginx
    
  • NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  • nginx Official build of Nginx. 6959[OK]
  • jwilder/nginxproxy AutomatedNginx reverse proxy for docker c... 1134 ]
  • richarveyphpfpm Container running + PHPFPM capable 452 ]
  • ...
  • ...
  • 拉取官方镜像,其中上面的非官方镜像是用户们根据自己的需要制作的镜像,方便大家的使用。

     docker pull nginx
    
  • Usingdefault tag: latest
  • latestPullingfrom librarynginx
  • afeb2bfd31c0Pull complete
  • 7ff5d10493dbDownloading[===============> ] 6.651 MB/21.87 MB
  • d2562f1ae1d0Download complete
  • 在这里顺便说一下,docker 镜像是分层存储的,所以上面的 nginx 镜像有 3 层,另外每根据新的容器制作一个新的镜像以后会给这个镜像加上一层。

    接下来直接利用这个镜像启动一个新的容器:

    name mynginx d p 8080:80 nginx

    此时中浏览器中输入:http://localhost:8080/ 即可访问 nginx。 参数解释:

    • --name 为容器取一个名字
    • -p 参数语法为 -p host port:container port-p 8080:80 将主机上的8080端口绑定到容器上的80端口,因此在主机中访问8080端口时其实就是访问 nginx 容器的80端口
    • -d 后台运行容器

    然后我们来看一个更复杂的例子:

    nginx \ 
    
  • v hostpathconf:/etc/ro \
  • somehtml/usr/sharero \
  • \
  • d nginx
  • 这个例子多了一个参数 -v,这个参数的作用是把本地的文件或者文件夹挂载到容器中,其中最后面的 ro 或者 rw 控制这个挂载是否可写。

    • -v 参数语法为 -v host dir:container dir[:ro|rw]

    上面的命令将本地文件中的 nginx.conf 配置文件挂载到容器,并且将要展示的静态页面也挂载到容器。 注意:在容器执行一条命令以后,当这个命令结束运行,容器也会结束运行。

    接下来让我们看看 docker 别的命令。

    查看所有运行中的容器:

     docker ps
    
  • CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 1fe91b5a4cd4 nginx "nginx -g 'daemon ..."39 minutes ago Up minutes 0.0.->80tcp a ### 列出包括未运行的容器
  • 查看容器运行日志:

     docker logs nginx
    
  • 172.170.1[05/Oct2017073111+0000 "GET / HTTP/1.1"200612"-""Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0""-"
  • 1005error7#7*1 open()"/usr/share/nginx/html/favicon.ico" failed (2No such fileor directory), client0.1,184)"> server localhost request"GET /favicon.ico HTTP/1.1" host"localhost:8080"
  • 重启容器:

     docker restart nginx
    

    停止运行一个容器:

     docker stop nginx
    
  • ps
  • CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 启动一个已经存在的容器:

     docker start CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    
  • 503 seconds nginx
  • 重命名容器:

    nginx new docker imags

    使用已经存在的容器创建一个镜像:

     docker commit m "nothing changed"image
    
  • sha256f02483cdb842a0dc1730fe2c653603fa3271e71c31dbb442caccd7ad64860350
  • docker images
  • REPOSITORY TAG IMAGE ID CREATED SIZE
  • image latest f02483cdb842 6 seconds ago 108nginx latest da5939581ac8 weeks ago MB
  • 使用我们自己创建的镜像创建容器:

    test808112ba86eabdef0121d875bdb547f1101d4eb54ff7cb36e20214fb1388659af83d
    
  • 12ba86eabdef image 7 seconds ago 5test
  • 299f4ede9e79attach 命令来介入这个容器,就跟我们使用 ssh 连接一台服务器差不多。

     docker attach somecontainer
  • 在创建一个容器时直接启动一个可交互式的 shell, 并且退出后自动删除容器:

    it --  centos

    总结

    本文介绍了 docker 的简单用法,同时也给出了一个实际的例子用来展示 docker 命令的各种操作。作为一个快速入门的文章,本文写的相对有点简单,很多概念上的东西还需要求查看别的资料理解,但是看完本文应该就具备使用 docker 的基本能力了。此外,后续的文章应该会写一点 Dockerfile 与 docker-compose 相关的内容。


    原文地址:https://blog.csdn.net/yilovexing

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    最近一直在开发Apworks框架的案例代码,同时也在一起修复Apworks框架中的Bug和一些设计上的不足。遇到的一个普遍问题是,代码的调试过程需要依赖很多外部系统,比如MongoDB、PostgreSQL、RabbitMQ等。当然可以在本机逐一安装这些服务,然后对服务进行配置,使其满足自己开发调试
    最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。在文本发布和处理微服务中,我打算使用微软的SQL Server for Linux来做演示,于是也就在自己的docker-compose中加入了MS SQL Server的服务。其实在Docker中运行SQL Server是非常容
    在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。 构建ASP.NET C
    最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上,写篇文章简单总结一下。 Rook-Ceph是Kubernetes中分布
    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
    构建镜像最具挑战性的一点是使镜像大小尽可能的小。Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件。对于多阶段构建,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础,并且每个指令都开始一个新的构建。您可以选择
    本文介绍compose配置文件参数的使用,熟练编写compose文件 [root@docker lnmp]# cat lnmp.yaml version: '3' services: nginx: build: /root/docker_demo/nginx/ ports: - &q
    环境 docker-machine主机:192.168.1.9 docker主机:192.168.1.10 步骤: 安装docker-machine 创建ssh密钥对,实现两主机无密登录 创建docker主机,命名host1 变更docker环境变量 运行容器查看两端是否同步 镜像容器同步测试成功
    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
    https://blog.csdn.net/wanglei_storage/article/details/77508620 实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行。然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容
    1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题。 2. Why Need Nginx .NET Core中默认的Web Server为Kestrel。 Kestrel is grea
    docker rm `docker ps -a | grep Exited | awk '{print $1}'` 删除异常停止的docker容器 docker rmi -f `docker images | grep '<none>' | awk &#3
    什么是Docker Compose 在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具。 但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢?干脆直接用单体服务就行了!直到我遇到了以下的一个需求,让我明白了在一台服务器上不得不用多个服务的时
    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
    很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常。通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程。 VS中的附加进程非常强大,目前提供了9种常用的附加方式。 在当前.Net Core支持跨平台的大背景下,其中Linux环境和
    https://www.cnblogs.com/bigberg/p/8867326.html 一、简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编排在一起,同时管理。同样在Swarm集群中,可以使用docker stack 将一组相关联的服务进行
    .Net6中想实现对某个网址截屏,可通过Selenium模拟访问网址并实现截图。 实现 安装Nuget包 <PackageReference Include="Selenium.Chrome.WebDriver" Version="85.0.0" /&g
    原文 https://www.cnblogs.com/gispathfinder/p/5871043.html 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定。 co