docker 命令简介

docker 简介

docker是什么呢?给大家描述几个应用场景吧,描述完大家大概就知道这个东西是用来干嘛的了。

场景1

  • 相信稍微有点经验的程序员在开发的过程中都面临着部署应用的问题,假设你现在在本地辛辛苦苦开发出了一个网站,准备部署。这个时候你就很自然的联想到应该在服务器上搭建一个和本地运行环境一样的环境出来。如果是nodejs,虽然已经有了npm,有了各种打包工具,可是你还是面临着一系列的操作。而且最后还是有可能运行不起来,因为你的应用可能依赖于系统,读写系统文件,或者某些文件忘记拷贝之类的错误,让人难受。而在有了docker之后呢,你可以很方便的将应用通过docker打包起来,从而解决运行环境不一致而导致应用不能运行的问题。

场景2

  • 现在假设,你和你的同事把自己编写好的代码都放到了一个程序服务器里面运行。不小心的是,你的同事程序有问题,内存泄漏而且还很严重,吃内存而且还吃得特别的多。尴尬了,你的代码一放上去,跑不起来,报错,运行特别的慢。这个时候如果你们的程序是用docker管理的话,这个问题就自然而然的解决了,在运行之前docker会限制好每个应用可用的内存和CPU,并将其和其他的进程隔离。这样你就可以安心的跑代码了~

场景3

  • 假设现在你面对一个全新的操作系统,里面没有任何应用。现在你写了一个java web应用。依赖了非常多的东西,有mysql,tomcat,jdk等等等等。你需要一个个的把他们装上去,有过类似经历的相信大家都知道,这个过程并不好受,保不住就可能遇到一些问题,然后就需要你话大把大把的时间去配置环境。有了docker之后呢?嘿嘿,这些就免了吧,因为这些依赖都会被放进一个叫做镜像的东西,你的代码可以在镜像里面寻找依赖,完成运行。而你的系统呢,只需要一个docker就好了~

听完上面的描述,docker是不是很诱人啊~在这里给大家推荐一个docker的视频教程,挺不错的:

想要对docker有更深入的了解,可以去看这个视频,我也是从这个视频过来的,算是个小白。这篇博客也算是一个笔记吧~

简单docker执行流程

主要是为了帮助到家快速的建立起对docker一个简单的印象,这里放上几个一连串的命令,大家执行完命令之后就就可以看到第一个docker执行之后的效果。这个,两分钟入门,最多了哈哈哈

$su
#apt install docker.io
#service docker start
#docker pull hello-world
#docker run hello-world

在第一个run执行完毕之后呢,会有一段输出


Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

这里说了一下你执行这个hello world所发生的一些事情。这里给大家翻译一下

  1. docker 客户端连接到docker的守护进程(守护进程:在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。)
  2. docker的守护进程在收到client的命令之后从Docker Hub(Docker官方的镜像中心,里面存放了很多各种各样的镜像),下载hello-world镜像。
  3. 然后你执行了run命令,守护进程会在镜像(这里可以假设会某一种环境)创建一个容器,这个容器会执行指定的可执行文件或者命令。
  4. 守护进程通过流的方式将执行的输出传送到你的终端。

上图
这里写图片描述

docker基础命令

记录一些docker的命令,为了以后可以很方便的查阅,也希望为其他人在学习docker的时候提供一些帮助。

ps: 以上内容都是在ubuntu 16.04 下完成的

  • 安装docker
$ sudo apt install docker.io
  • 查看docker版本
$docker version
[out]
    version   Show the Docker version information
    volume    Manage Docker volumes
    wait      Block until a container stops, then print its exit code

Run 'docker COMMAND --help' for more information on a command.
pj@lab:~/pro/js/webapp$ docker version
Client:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   78d1802
 Built:        Tue Jan 31 23:35:14 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
[ps: 这里指示没有连接到 docker daemon.目前所知的两个原因:1. 普通用户似乎查看不到服务器的状态,2. 服务没启动]
  • 启动docker 服务
$ sudo service docker start
  • 拉取镜像
$ sudo docker pull [OPTIONS] <image_name>[:TAG]
[ps] 不加sudo会提示服务没有运行,这是因为权限的问题,大概是普通用户没有权限修改文件之类的吧

这里推荐大家用网易蜂巢的docker镜像仓库,无他,唯快尔!(在国内,起码比docker hub快)

  • 查看镜像
$ sudo docker images 

ps: 太麻烦了,建议大家在处理docker的时候还是直接使用su 命令,使用root用户的身份来吧。不然每个命令前面都要加上sudo。

  • 运行镜像
# docker run hello-world
  • 后台运行镜像
    一般用于那种需要一直在后台执行的应用,比如说服务器啊~这样的话,就不需要长期占用一个窗口了
# docker run -d hello-world
  • 查看正在运行的镜像
# docker ps
  • 进入正在执行的镜像
# docker exec --help
[out]
Run a command in a running container

  -d, --detach         Detached mode: run command in the background
  --detach-keys        Override the key sequence for detaching a container
  --help               Print usage
  -i, --interactive    Keep STDIN open even if not attached
  --privileged         Give extended privileges to the command
  -t, --tty            Allocate a pseudo-TTY
  -u, --user           Username or UID (format: <name|uid>[:<group|gid>])

常用的格式是:

# docker exec -it <docker_image_id(可不完整,能识别就行)> bash

通过上面那条命令,你可以进入一个docker为了运行程序而虚拟出来的一个操作系统。

  • 结束正在运行的镜像
# docker stop <docker_image_id>
  • 使用桥接的方式进行端口映射

ps: 为了帮助理解,这里为docker的网络做一个简单的介绍。docker中的网络模式一共有三种:bridge, host, none。最后一种是不开放任何网络,运行的镜像和外界没有任何联系。第一个和第二种的话,看图
这里写图片描述
host模式下,主机网卡和docker container直接相连。也就是说,访问的主机的端口相当于是直接访问container 端口。而在bridge模式下,会有一个端口映射的过程,将主机的一个端口映射到container中,当主机的某一个端口有请求的时候,会通过主机网卡到bridge再到container中,请求返回的内容会按照一样的顺序返回到主机网卡再出去。docker默认的启动方式为bridge
+ 指定映射端口

# docker run -d -p 8080:80 nginx(假设容器的名称为nginx)

这样当你访问主机的8080端口的时候,请求会被docker container中的80端口处理并返回出来。

  • 映射到随机端口
    将开放的所有端口映射到一个随机端口中
# docker run -d -P nginx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章