【面向初学者】通过动手操作学习Docker入门
首先
本文是针对“计划开始接触/学习Docker的人”撰写的文章!
-
- Dockerの歴史
- 実際にDockerを動かすハンズオン
写着!
Docker是一种容器化平台。
首先,Docker是什么东西?
简言之,它是一种用于构建轻量级虚拟环境的工具。
在过去,工程师们在进行开发时经常使用虚拟化工具(如Hyper-V、Vagrant和VirtualBox)在计算机上创建虚拟机。尽管这些工具非常方便,但它们都存在一些问题,比如“环境搭建耗时”、“启动速度慢”和“文件大小较大”。
解决这类问题的是一种叫做Docker的容器化虚拟化技术。与传统的超级虚拟化技术不同,Docker利用主机操作系统来运行应用程序,不再需要启动和使用“GuestOS”。另外,由于Docker采用容器化虚拟化技术,所以将被执行的应用程序单元称为“容器”。(※如果要使用容器化虚拟化技术,主机操作系统必须是Linux。)
问:为什么不需要使用”GuestOS”?
答:通过使用Linux内核,可以在容器单位中运行应用程序(进程),因此不需要GuestOS。
参考:关于Linux内核和发行版本的信息。
关于容器虚拟化技术的历史
尽管Docker(容器化虚拟化技术)看起来非常方便,但它似乎是最近才变得流行起来的。
但是容器技术本身早在1980年左右就已经存在了。
容器技术的起源”chroot”
1979年诞生了作为容器技术起源的「chroot」。如其名称所示,它是一种可以改变根(/)目录的技术。
通过对chroot中的根目录和相应目录授予用户权限,可以创建一个伪造的虚拟环境,允许多人访问。它被称为容器技术的起源,因为它像现代的容器技术一样,使用了“一个Linux内核”来创建多个虚拟环境。
据说由于被chroot分隔的目录无法访问外部,因此被称为”chroot监狱”。
据说由于chroot在安全性方面存在问题,因此后来开始使用后继的”FreeBSD Jail”作为租用服务器或托管共享服务器。
据说根据安全性的角度来看,由于chroot可以在两个步骤中轻松突破,因此它没有意义。
容器技术的核心组件”Cgroup, Namespace”。
通过之前的chroot等途径我们已经成功创建了容器型虚拟化环境。
然而,过去的虚拟化技术存在一些问题,其中包括无法完全实现与主机的进程分离,无法进行硬件资源分配等。为了解决这些问题,cgroup(由Google公司开发)和namespace(由RedHat公司开发)等技术已经公开发布。
命名空间
命名空间是一种用于隔离系统网络、进程等的技术。有了这个技术,容器化的虚拟化技术就可以作为完全隔离的虚拟环境来使用。
问:什么是进程?
答:进程是在CPU上执行的程序或应用的单位。
https://milestone-of-se.nesuke.com/sv-basic/architecture/cpu/
控制组
cgroup是一种用于分离硬件物理资源的技术。
我认为那些有使用过基于虚拟化技术的人应该有所了解,在创建虚拟环境时,可能会分配内存和CPU吧?
为了实现以虚拟环境单位分离和限制内存和CPU的机制,使用了cgroup。
然后将其带入现代「LXC,Docker」。
这些用于虚拟化的技术出现后,像我们现在仍在使用的容器技术也逐渐在世界上流行起来。
其中特别有名的是”LXC(Linux容器)”和”Docker”。
Linux容器(LXC)
2008年左右宣布了搭载namespace和cgroup的首个Linux容器引擎——LXC(IBM公司),它成为了一种无法通过chroot实现的、能够将进程和物理资源进行隔离的容器虚拟化技术的原型。至今,LXC仍被广泛用作“构建轻量级Linux虚拟环境的工具”在各个领域中使用。
Docker:
容器化
没等了。2013年,**Docker(dotCloud公司,现在的Docker公司)**终于发布了。
Docker与LXC不同,它是为了应用程序部署而开发的技术,因此采用了“一个容器一个进程”的机制。
由于“第三方的丰富性”和“低门槛的采用度”,Docker成功夺取了虚拟化技术的霸权。
据说最初Docker的发布是以LXC技术为基础的,但随着时间的推移,为了摆脱对LXC的依赖关系,开始使用libcontainer。
以下是参考文章:
-
- 【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに?
-
- コンテナってなんだろう― 「コンテナ」の概要を知る – Think IT
- 【chroot】 なぜFTPでレンタルサーバーにアクセスしても、他のアカウントのファイルが見れないか?
让我们使用Docker试试看。
(Native Chinese translation)
我认为在前一章中,您对容器化虚拟化技术的理解已经加深了。从本章开始,我们将通过实际操作来学习如何使用Docker。
关于Docker中使用的”镜像”和”容器”。
之前,我解释过Docker是通过利用宿主操作系统来启动虚拟化的应用程序。现在,我将解释一下如何创建这个虚拟化的应用程序。
作为使用Docker的我们,需要记住两个Docker术语。
イメージ:コンテナを実行するためのテンプレートが記載されている
コンテナ:イメージを用いて、仮想環境上でアプリを起動させる
形象,是指一个人或事物在人们心中留下的印象或表现出来的形象,通常通过视觉或感官来感知。
容器是什么
让我们创建一个Docker环境
让我们从DockerHub安装Ubuntu环境并启动nginx。
首先,从DockerHub上安装Ubuntu镜像。
docker pull ubuntu:latest
使用容器来执行已安装的Ubuntu镜像。
# open browser 「localhost:8080」
docker run -it -d -p 8080:80 --name ubuntu ubuntu:latest
链接:
- 「docker run -it」にするとコンテナがすぐに終了しない理由
由于尚未安装和启动nginx,我们需要在Ubuntu上安装并运行nginx。
# Ubuntu環境に侵入
docker exec -it ubuntu bash
# nginxのインストール
apt update && \
apt install -y -q curl gnupg2 && \
curl http://nginx.org/keys/nginx_signing.key | apt-key add - && \
apt install -y -q nginx
# nginxの起動
nginx
# reload browser 「localhost:8080」
如果要停止启动的容器,请执行以下操作
# コンテナの停止
docker stop [コンテナID]
# コンテナの削除
docker rm [コンテナID]
用传统的虚拟化技术,准备和启动可能需要数十分钟到数小时的时间,而有了 Docker,只需数秒到数分钟就可以启动!(太好了!)
请查看以下资料:
-
- Docker コマンド — Docker-docs-ja 19.03 ドキュメント
- 【Ubuntu + Nginx】Docker イメージの作成手順
让我们使用Dockerfile。
你是否已经了解了关于Docker的概述?
为了方便使用Docker,存在着一个名为”Dockerfile”的功能。
现在就来解释一下这个”Dockerfile”的内容。
DockerFile是什么? (DockerFile is what?)
我之前使用Docker,在Ubuntu容器内启动了Nginx,但是每次都需要进入Ubuntu来启动Nginx,这很繁琐。
所以我们将使用之前提到的”通过自己创建映像”的方法来创建一个启动Ubuntu + nginx环境。
在这个过程中,我们会用到的是”Dockerfile”。
让我们通过DockerFile创建自定义镜像吧。
以下是最终版本的Dockerfile,请在您喜欢的目录中创建一个名为Dockerfile(无扩展名)的文件,并写入以下内容。
# 利用する元のイメージを指定
FROM ubuntu:latest
# 必要なパッケージをインストール
RUN apt update && \
apt install -y -q curl gnupg2 && \
curl http://nginx.org/keys/nginx_signing.key | apt-key add - && \
apt install -y -q nginx
# nginx実行
CMD ["nginx", "-g", "daemon off;"]
通过执行以下命令,可以从目标的Dockerfile创建镜像。
# 「-t」は作成するイメージに付ける名前。今回は「ubuntu-nginx」と名付けます。
docker build -t ubuntu-nginx:latest .
由于已经创建了映像,因此您可以在以下命令中运行容器,这将启动一个Ubuntu+Nginx环境。
docker run --rm -p 8080:80 ubuntu-nginx:latest
因为镜像已经创建完成,所以你只需要启动容器,就可以使用ubuntu + nginx环境了!
让我们使用Docker Compose
通过使用上述内容中的Dockerfile,我成功构建了自己的原始镜像。最后,我想介绍一下用于更方便使用Docker的功能,称为”Docker Compose”。
Docker Compose是什么意思?
简单来说,”Docker Compose” 是一个用于管理容器的工具。
我們通過使用Dockerfile創建了一個自定義的虛擬環境(映像),並在容器中執行了該映像。
然而,在實際開發中,很少只需要一個映像(容器)的情況。
-
- フロントエンドサーバー
-
- バックエンドサーバー
-
- DBサーバー
- セッションサーバー
需要为各种应用程序准备执行环境。
但是,每次都要一个个运行Docker容器太麻烦了。
在这种情况下,你可以使用”Docker Compose”来一起运行和管理多个容器环境。
我们可以使用Docker Compose来运行多个容器。
以下是我们将要完成的Docker Compose的最终形式。
我们将创建一个名为docker-compose.yml的文件,并填写以下内容。
我想要在之前创建的Ubuntu+Nginx镜像之外,执行PHPAdmin和MySQL的镜像。
version: '3'
services:
# 先程作成したイメージを指定
app:
# Dockerfileを指定することも可能
# https://qiita.com/kai_kou/items/eaafa3cb15e1496f50ec
image: ubuntu-nginx
ports:
- 8080:80
# 利用するイメージを追加
mysql:
image: mysql:8.0-oracle
environment:
- MYSQL_ROOT_PASSWORD=password
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=password
ports:
- 8081:80
通过执行以下命令,可以从目标的docker-compose.yml文件中创建容器,该文件包含了要使用的镜像。
docker-compose up
停止时,请使用以下命令
docker-compose down
通过使用Dockerfile和Docker Compose,我们现在能够使用一个指令创建各种不同的环境。
此外,Dockerfile和Docker Compose是文本文件,所以能够在Git中进行管理也是令人高兴的!
Docker总结
Docker (Docker容器技术)
-
- Linux上で利用することのできる、「軽量な仮想環境」を作れるツール
-
- 「イメージ」から「コンテナ」を作成し、プロセスの実行を行う
- 「DockerHub」というところにある、様々なイメージを利用することができる
Dockerfile:
-
- DockerHubにあるイメージを自分好みにカスタマイズして、新しいイメージを作成する機能
- 「Dockerfile」というファイルに、自分のカスタマイズ環境を記載する
Docker Compose是什么
-
- コンテナのマネジメントを行う機能
-
- 「docker-compose.yml」というファイルに、管理したい「イメージ」「コンテナ」の指定・設定を行う
- 利用できるイメージは「DockerHubにあるイメージ」、「ローカル環境で作成したイメージ」、「Dockerfile」のいずれか
最终而言
我们公司正在进行QiitaEngineerFesta2023的文章投稿活动。
期待您的参与和投稿!