docker入门基础教程使用分享(一)

484 阅读6分钟

前言:
前段时间看到阿里技术交流群里,有个小姑娘在问关于docker的问题,突然想到好像最近几年docker非常的火热,特别是在项目交付,环境部署。最近也学了学docker相关的知识,分享给大家。

1、docker基础简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

2、docker的安装

目前 docker 已经支持在windows、linux、macOS 上使用,最常用的还是在 Linux 中对项目的部署。

在 windows 中安装

首先我们去官网下载 windows 安装程序,docker 官网 在首页我们可以看到一个 getStarted 按钮,点击后跳转到下载地址。 点击下载 windows 程序。
安装步骤就直接下一步,下一步就可以,安装完成后会在右下角任务栏中出现一个docker的图标,一个小船,点击能够看到这样的界面,代表安装成功。 刚刚安装完是没有容器的,在这里应该会看到一个引导界面,创建一个容器,由于网络问题,应该很多人都没有办法在这里安装成功这个容器。后面我会分享如何创建容器,看到这个界面就代表安装成功。

在 Linux 中安装

在linux中安装docker就比windows要简单很多。只需要一条执行命令就可以下载并安装docker

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

等待命令执行结束,在输入 docker -v 可以看到打印出 docker 的版本信息,代表安装成功

在 macOS 中安装

在macOS中安装非常简单,通过macOS的一个包管理工具 Homebrew 来安装docker

$ brew install --cask docker

验证安装和linux是一样的

3、docker 初步了解

学习docker之前先聊一下docker到底是个啥,经常听到的名词又是些啥。
docker 我理解就是一个专门将环境打包且运行的一个工具,比如我们可能想在用 Nginx 跑一个简单的项目,又不想买个服务器装环境,也不想装个虚拟机,这个时候 docker 就出现了。
通过 docker 下载一个Nginx的镜像,然后将镜像跑起来。进入到这个容器中,找到Nginx项目目录。将项目拷贝进去就可以在浏览器访问了。
刚刚提到了镜像,镜像是docker的跑环境时需要的文件,就像虚拟机跑一个系统,需要先有系统镜像才可以跑起来。但是虚拟机中的系统镜像都是非常庞大的。docker中的镜像都是精简版的,只为提供指定服务的镜像。
还提到了一个词叫容器,容器就是docker将镜像跑起来的环境,叫做容器。docker非常厉害的地方,就是能够将每个容器独立起来。起两个镜像可以做两个不同的事情。容器与容器之间相互独立。
接下来我们可以一边学习 docker 一边去理解 docker。

4、docker的常用命令

我们学习 docker 可以通过一种带着问题的方式去学习,先有问题,再针对问题展开学习。上面已经安装好了 docker ,那我们来看看 docker 都有哪些常用的命令吧。
【问题】我如何知道我的 docker 版本是多少?

$ docker -v
$ Docker version 20.10.11, build dea9396
$ docker --version
$ Docker version 20.10.11, build dea9396

【问题】我如何知道我的 docker 的一些详细信息呢?

$ docker info

通过 docker info 会查看到当前docker的所有信息,比如版本,容器数量,镜像的数量,安装信息,等等的一些想要知道的都可以查看到,由于数据太长就不贴出来了。
【问题】我在还不熟悉命令的情况下应该怎么知道这些命令的用法呢?

$ docker info --help
$ Usage:  docker info [OPTIONS]
$ Display system-wide information
$ Options:
  -f, --format string   Format the output using the given Go template

在docker的所有命令后面都可以跟一个--help,来查看关于这个命令的一些参数信息。
【问题】如何下载一个 docker 镜像?

$ docker pull 镜像名字:[版本]

【问题】在哪里去找镜像的名字呢?
docker的镜像可以在官方提供的 dockerHub 仓库中找到dockerHub,也可以通过docker提供的搜索命令来查找。

$ docker search 镜像名字:[版本号]
$ docker search nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15928     [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2101                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   820                  [OK]
jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…   288
linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   160
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   147                  [OK]
jlesage/nginx-proxy-manager       Docker container for Nginx Proxy Manager        145                  [OK]
alfg/nginx-rtmp                   NGINX, nginx-rtmp-module and FFmpeg from sou…   111                  [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co…   79                   [OK]
privatebin/nginx-fpm-alpine       PrivateBin running on an Nginx, php-fpm & Al…   61                   [OK]
nginx/nginx-ingress               NGINX and  NGINX Plus Ingress Controllers fo…   57
nginxinc/nginx-unprivileged       Unprivileged NGINX Dockerfiles                  55
nginxproxy/nginx-proxy            Automated Nginx reverse proxy for docker con…   29
staticfloat/nginx-certbot         Opinionated setup for automatic TLS certs lo…   25                   [OK]
nginx/nginx-prometheus-exporter   NGINX Prometheus Exporter for NGINX and NGIN…   22
schmunk42/nginx-redirect          A very simple container to redirect HTTP tra…   19                   [OK]
centos/nginx-112-centos7          Platform for running nginx 1.12 or building …   16
centos/nginx-18-centos7           Platform for running nginx 1.8 or building n…   13
flashspys/nginx-static            Super Lightweight Nginx Image                   11                   [OK]
bitwarden/nginx                   The Bitwarden nginx web server acting as a r…   11
webdevops/nginx                   Nginx container                                 9                    [OK]
mailu/nginx                       Mailu nginx frontend                            9                    [OK]
sophos/nginx-vts-exporter         Simple server that scrapes Nginx vts stats a…   7                    [OK]
ansibleplaybookbundle/nginx-apb   An APB to deploy NGINX                          3                    [OK]
wodby/nginx                       Generic nginx                                   1                    [OK]
  • NAME 是搜索的镜像名称
  • DESCRIPTION 镜像的描述
  • STARS 小星星数量
  • OFFICIAL 是否是官方提供的镜像
  • AUTOMATED 个人制作的镜像 常见的环境镜像都是可以找到官方提供的,如果想要下载指定版本,就还是要去官网查看该镜像的详细信息。因为不是所有的环境镜像的版本都是跟官方环境的版本完全一致。
    【问题】如何查看下载后的镜像?
$ docker images 
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mycentos     1.0       caa240d3a306   23 hours ago   295MB
mysql        5.7       738e7101490b   12 days ago    448MB
nginx        latest    f652ca386ed1   12 days ago    141MB
  • REPOSITORY 镜像名称
  • TAG 版本
  • IMAGE ID 版本id
  • CREATED 创建时间
  • SIZE 镜像大小 images这个指令还有三个参数:
  1. -a 所有的镜像,包括默认的镜像
  2. -f 过滤参数,可以对所有的镜像过滤
  3. -q 只显示镜像的id。后面会有些操作就适合用到这个参数
    【问题】如何删除已经下载的镜像?
$ docker rmi -f 镜像id # 删除一个镜像
$ docker rmi -f 镜像名称 # 删除一个镜像
$ docker rmi -f 镜像id 镜像id # 删除两个镜像,删除多个镜像同理,空格隔开
$ docker rmi -f $(docker images -aq) # 删除所有的镜像

在上面可以看到最后一条指令,不要疑惑。很好理解,docker为了提供一些便利性,可以允许传入参数,方法就是通过 $() 来传递参数,上面讲查看镜像的时候,讲到了有-q参数,只显示id。这个时候就派上了用场。
【问题】如何运行一个容器?

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mycentos     1.0       caa240d3a306   23 hours ago   295MB
mysql        5.7       738e7101490b   12 days ago    448MB
nginx        latest    f652ca386ed1   12 days ago    141MB
$ docker run -d -p 8088:80 --name nginx01 f652ca386ed1
4dde2f51f06d0f1f6091b42404d90cad4a06619b3849b055e9d78eca428d86b1

通过docker run 命令运行一个镜像,得到一个容器。执行结束会返回一个容器的id。\

参数讲解:

  • -d 设置运行方式,后台运行还是交互式运行
  • -p 设置docker容器的端口和本机端口的映射 主机端口:容器端口
  • --name 设置容器的名字
    为什么需要映射端口呢?这就是docker比较精髓的地方,docker可以把每个容器独立起来,每个容器内部与外部并不互通,你可以跑多个容器,比如都是Nginx,默认端口为80.如果你在一个机器上跑了多个Nginx容器,都指向80端口,从本机的80端口访问是访问不到的,因为服务是起在docker的容器中,所以需要你将两个端口联通起来。那么就是用到了上面的-p参数。
    这个时候你就可以去浏览器通过本地ip或者 localhost:8088 访问刚刚跑起来的Nginx服务 【问题】如何查看当前有哪些容器?
$ docker ps 
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
4dde2f51f06d   f652ca386ed1   "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   0.0.0.0:8080->80/tcp   nginx01
  • CONTAINER ID 容器id
  • IMAGE 镜像id
  • COMMAND 容器执行的cmd命令
  • CREATED 容器创建时间
  • STATUS 容器的状态
  • PORTS 容器映射端口的信息
  • NAMES 容器的自定义名称\

docker ps 这个指令也有一些参数,

  • -a 显示所有的容器
  • -f 过滤条件
  • -n 显示指定条数的容器
  • -l 显示最新创建的容器包括状态
  • -q 显示所有容器的id
  • -s 显示所有容器的大小\

【问题】如何停止一个正在运行的容器?

$ docker stop 容器id  # 停止当前容器
$ docker kill 容器id  # 强制停止容器

【问题】如何启动一个停止的容器?

$ docker start 容器id  # 启动当前容器

【问题】如何重启一个容器?

$ docker restart 容器id  # 启动当前容器

上面讲到的几个操作容器的指令都是可以支持多个参数的,比如一次停止多个容器,启动多个容器。都是没问题的。
【问题】如何查看一个容器的进程?

$ docker top 容器id 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1307                1287                0                   07:24               ?                   00:00:00            nginx: master process nginx -g daemon off;
uuidd               1363                1307                0                   07:24               ?                   00:00:00            nginx: worker process
uuidd               1364                1307                0                   07:24               ?                   00:00:00            nginx: worker process
uuidd               1365                1307                0                   07:24               ?                   00:00:00            nginx: worker process
uuidd               1366                1307                0                   07:24               ?                   00:00:00            nginx: worker process

【问题】如何查看一个容器的元数据?

$ docker inspect 容器id  

关于查看元数据,是可以看到所有关于这个容器的信息,名字、id、存储信息、网络,等等,一切相关这个容器的所有信息都在这里可以看到。
【问题】如何进入一个容器?

$ docker exec 容器id /bin/bash   # 新窗口进入容器,通过bin/bash的方式  
$ docker attach 容器id /bin/bash # 进入当前容器上一次离开的位置,容器正在做啥进去就在做啥

【问题】如何退出一个容器?

exit  # 退出并停止容器  
Ctrl + p + q # 退出容器,但不停止运行

上面的操作都是在进入容器以后。
【问题】如何删除容器?

$ docker rm -f 容器id        # 根据容器id删除
$ docker rm -f 容器名称       # 根据容器名称删除
$ docker rm -f 容器id 容器id  # 根据多个容器id删除

结语

当您看到这里,基本就对 docker 的常用语法掌握的差不多了。如何下载安装docker,如何下载查找镜像,如何运行一个镜像,对镜像的增删改查。对容器的一些处理。都是没有问题的。
更新不易,还望各位观看的小伙伴们给予一些动力。如果您觉得对您有帮助,希望您可以分享给身边的朋友,有写的不对的地方欢迎指导。后面还会持续更新关于docker的高级操作。如果您有啥好玩或者了解的一些技术,也可以在后台留言给我。我会对应学习给大家分享哟。
感兴趣的小伙伴们可以关注一波呀,后续会更新 docker 的其他高级操作。