炼数成金 门户 大数据 虚拟化 查看内容

Docker新手指南

2018-4-3 14:15| 发布者: 炼数成金_小数| 查看: 20003| 评论: 0|原作者: 姜俊厚 译|来自: Docker

摘要: 容器只是实现流程隔离的一种方式。与虚拟机不同,它们不通过模拟硬件实现隔离,而是通过使用现有的Linux内核功能实现隔离。在一个典型的Unix / Linux操作系统中,所有进程共享相同的用户空间,但是通过在Linux 2.6+ ...

数据库 Hadoop 服务器 Linux Docker 进程

什么是容器?
容器只是实现流程隔离的一种方式。与虚拟机不同,它们不通过模拟硬件实现隔离,而是通过使用现有的Linux内核功能实现隔离。

在一个典型的Unix / Linux操作系统中,所有进程共享相同的用户空间,但是通过在Linux 2.6+中引入的新功能,您可以创建一个自己单独拥有的独立环境(如文件树、线程等)的进程。这些与其他内核技术相结合的特性是容器背后的魔力。

在本文中,我将介绍基本的Docker命令和概念。阅读完毕后,您将能够采用一些Docker功能来加速和简化您的日常工作流程。

安装Docker
在OS X / Windows中使用安装向导安装Docker是一项简单的任务。可以在Docker社区页面上找到适用于操作系统的安装程序。在Linux上,Docker通常在分发包管理器中可以找到。

在Fedora[1]中安装Docker:
sudo dnf install docker

启动进程:
sudo systemctl start docker

使Docker进程开机自启动:
sudo systemctl enable docker
在其他使用Systemd的Linux发行版中,这些步骤类似。

入门
Hello World

一旦你完成安装,我们可以尝试一个容器的Hello World应用:

#sudo is only for Linux
sudo docker run --name hello -it busybox echo "Hello World!" # Hello World!

只有在运行某些Linux发行版时才需要使用sudo,但请记住,Docker需要管理员权限才能创建遏制。在编写本文时,在OSX和Windows中使用一些基于Linux的虚拟机,所以Docker命令可以在这些系统中没有特权用户的情况下运行。

如何工作
sudo docker run <options> <image> <command to run inside the container>

run参数项创建并运行一个容器,其中一个特点是Docker将容器的生命周期和执行进程进行了绑定(在这个例子中是Linux的echo命令),这意味着当进程结束后容器也跟随终止了。

Name:我们设置容器的名称,如果你不选择任何Docker将随机选择一个。
It:交互式的,它将我们的终端连接到容器虚拟TTY的输出,允许与正在运行的进程交互。
Busybox:这是创建容器的基础映像,可以认为带有应用程序运行所需的文件和文件夹组成的zip文件。 Docker Hub中有一个完整的社区基础镜像,使用busybox[2]是因为它非常轻便,压缩后只有715 KB
Echo:正如前所述,echo是执行的命令,包含在busybox镜像中。

如果想检查命令是否在busybox中可用,可输入如下命令:

sudo docker run -it busybox ls /bin/

列出缓存的镜像
当你第一次执行Docker命令时,镜像被下载并被缓存以加快速度。可以使用以下命令检查本地镜像:

sudo docker images

守护进程模式下运行
在某些情况下,我们不想直接与某些应用程序(如服务器)进行交互,此时我们希望生成该进程并返回终端以继续工作,Docker为我们提供了一种使用守护进程模式执行进程的方法,像如下命令使用-d参数这样:

sudo docker run -d --name snooze busybox sleep 15

这个进程将在后台运行15s后退出。

列出后台运行的容器
一旦容器在后台运行,可以使用如下ps命令检查容器状态:

sudo docker ps

杀死运行的容器

停止一个容器很简单:
sudo docker stop [name of your container]
#例如
sudo docker stop snooze

该命令会停止运行的容器,但是Docker服务会将创建的容器和其关联的命令缓存在磁盘中。如果你想再次重复执行同样的命令,只需要执行:

sudo docker start snooze

如果想改变配置并重用容器名,需要停止并删除容器,假设我们想改变snooze容器为休眠10秒而不是15秒:

#stop & clean
sudo docker stop snooze
sudo docker rm snooze
 #re-create
sudo docker run -d --name snooze busybox sleep 10

挂载
参数v允许我们将主机的文件挂载、映射到容器的文件夹。创建一个文件如:

echo 'Hello World' > hello

现在我们使用busybox中提供的独立文本编辑器来打开文件:

#使用容器的VIM打开文件
sudo docker run -it busybox vi hello

没有任何反应,这是因为vi进程是孤立的,无法访问容器外的文件。为了解决这个问题,我们需要挂载该文件夹,以便我们的编辑器能够找到该文件。

#the :z in /app:z -> is for SELinux, non-Linux can ignore this.
sudo docker run -it -v "$(pwd)":/app:z busybox vi app/text

这将挂载当前目录$pwd为容器内的/app目录。如果目录在容器内不存在,将自动创建,然后,使用vi打开文件位置vi app/hello。

一些实验:
参数v将覆盖容器内的以前的文件夹。如果存在,它将被替换为提供的文件夹
该命令从字面上是挂载文件夹,因此容器一旦被杀死,容器对该文件夹所做的每个更改都将被保留,如果您希望将数据库数据保存在容器生命周期之外,这是一个好方式
容器将有权访问您的系统资源(共享文件夹),所以要小心。

网络
选项p允许我们公开一个隔离的端口并通过特定的主机端口重定向。

为了说明网络如何与容器配合工作,首先让我们开始编写一个简单的JavaScript脚本来启动服务器。我们将在本地机器上执行此操作,因此我们来编写一些代码。

require('http')
  .createServer((req, res) => { res.end('Hello World!') }).listen(8080)

我们将调用这个文件index.js,它简单的创建了一个等待8080端口连接的服务器。当有人连接它时,它会发送“Hello World!”

下一步是在容器内运行脚本,可以执行如下命令:
sudo docker run -it -v "$(pwd)":/app:z --name myserver mhart/alpine-node node app/index.js

这里的新事物是基础镜像mhart/alpine-node,它将拉取一个Node.JS容器,然后像以前一样使用-v挂载文件夹,然后执行隔离节点的app/index.js进程。

让我们看看我们的服务器是否工作:

sudo docker exec -it myserver wget -qO- localhost:8080
# Hello World

这个命令是测试服务器在容器内工作,获得hello world反馈。现在我们试下从主机连接服务器,打开终端,执行:

curl http://localhost:8080
#curl: (7) Failed to connect to localhost port 8080: Connection refused

我们无法连接,因为容器的网络是隔离的,我们需要实现端口转:

# stopping our container
sudo docker stop myserver  
sudo docker rm myserver
sudo docker run -it -v "$(pwd)":/app:z -p 8080:8080 --name myserver \
 mhart/alpine-node node app/index.js

现在试下在浏览器中打开网址http://locahost:8080,你会看到hello world。

恭喜!你已经写了一个完美的容器化NodeJS应用。其中一个较大的好处是你可以在不安装NodeJS的情况下实现NodeJS应用,并且您可以使用此功能来安装其他类型的软件,如数据库,其他微服务等。

快速提示
在我的日常工作中,我总是需要集成MongoDB和Redis,但安装这些通常是一个痛苦的过程,我通过在.zshrc中创建一些bash脚本来解决了这个问题。

function new_mongo {
  docker run -d --name mongodb -p  27017:27017 mongo
}
# the : here means image tag, usually if the image is done correctly 
# like in this case tag version match the Redis version
function new_redis {
  docker run -d  --name redis  -p 6379:6379 redis:3.2
}
function stop_mongo {
  docker stop mongodb
  docker rm mongodb
}
function stop_redis {
  docker stop redis
  docker rm redis
}

在你的.bashrc或者.zshrc底部添加这一行,然后执行source ~/.bashrc || source ~/.zshrc,这样你就可以实现上面的功能了。

new_mongo # it will spin up a new mongodb instance. 
new_redis # it will spin up a new redis instance. 
# to stop this containers 
stop_mongo
stop_redis

现在,您将能够以零配置按需部署本地MongoDB或Redis实例,并且一个优势(至少在我看来)是这些实例中的数据是短暂的,这意味着当您终止容器时,它将重置数据库以及释放占用的空间。

Linux安全
如果你在Fedora使用参数v执行挂载文件夹的命令,会遇到如下错误:

sudo docker run -it -v "$(pwd)":/app busybox ls app/text
 #ls: can't open '.': Permission denied

这是因为SELinux[3]默认策略将禁止任何主机上的读写操作,以防止黑客在容器外执行操作,SELinux通过在内核级上的安全规则来保护您。

要将文件夹安装在支持SELinux的机器中,您需要指定z参数,这将更改SELinux上下文,并允许容器执行挂载动作。

# "$(pwd)" will get the actual directory, is equivalent to do pwd
docker run -it -v "$(pwd)":/app:z busybox /bin/sh

另一种方式(但不推荐)是暂时禁用这种保护:
su -c "setenforce 0"

完成后打开保护:
su -c "setenforce 1"

相关链接:
https://getfedora.org/es/workstation/
https://hub.docker.com/r/library/busybox/tags/
https://en.wikipedia.org/wiki/Security-Enhanced_Linux

原文链接:https://dzone.com/articles/docker-for-beginners

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 
1

鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (1 人)

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2018-9-21 03:54 , Processed in 0.482383 second(s), 24 queries .