Docker新手指南
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79786106
什么是容器?
在一个典型的Unix / Linux操作系统中,全部进程共享相同的用户空间,可是通过在Linux 2.6+中引入的新功能,您能够创建一个自己单独拥有的独立环境(如文件树、线程等)的进程。这些与其它内核技术相结合的特性是容器背后的魔力。
在本文中,我将介绍主要的Docker命令和概念。
阅读完毕后。您将能够採用一些Docker功能来加速和简化您的日常工作流程。
安装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
守护进程模式下运行
在某些情况下,我们不想直接与某些应用程序(如server)进行交互,此时我们希望生成该进程并返回终端以继续工作。Docker为我们提供了一种使用守护进程模式运行进程的方法,像例如以下命令使用-d參数这样:
sudo docker run -d --name snooze busybox sleep 15
这个进程将在后台运行15s后退出。
列出后台运行的容器
一旦容器在后台运行,能够使用例如以下ps命令检查容器状态:
sudo docker ps
杀死运行的容器
停止一个容器非常easy:
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
挂载
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将覆盖容器内的曾经的目录。
假设存在。它将被替换为提供的目录
该命令从字面上是挂载目录,因此容器一旦被杀死。容器对该目录所做的每一个更改都将被保留。假设您希望将数据库数据保存在容器生命周期之外,这是一个好方式
容器将有权訪问您的系统资源(共享目录)。所以要小心。
网络
为了说明网络怎样与容器配合工作。首先让我们開始编写一个简单的JavaScript脚本来启动server。我们将在本地机器上运行此操作,因此我们来编写一些代码。
require('http')
.createServer((req, res) => { res.end('Hello World!') }).listen(8080)
我们将调用这个文件index.js。它简单的创建了一个等待8080端口连接的server。
当有人连接它时。它会发送“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进程。
让我们看看我们的server是否工作:
sudo docker exec -it myserver wget -qO- localhost:8080
# Hello World
这个命令是測试server在容器内工作,获得hello world反馈。如今我们试下从主机连接server,打开终端。运行:
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应用,而且您能够使用此功能来安装其它类型的软件,如数据库,其它微服务等。
高速提示
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安全
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
Kubernetes零基础进阶培训
4月20日正式上课,点击阅读原文链接就可以报名。