前言:
前段时间看到阿里技术交流群里,有个小姑娘在问关于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这个指令还有三个参数:
- -a 所有的镜像,包括默认的镜像
- -f 过滤参数,可以对所有的镜像过滤
- -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 的其他高级操作。