docker的基本命令和使用示例

描述

概述

起源

2013 年由 DotCloud 公司开源出来的容器管理工具
DotCloud 公司是一家 PAAS 服务提供商,从 docker 的出身也可以看出它的主要功能和方向

技术原理

开始时是基于 LXC 容器技术

cgroup: 将任意进程进行分组化管理,同时还可以控制进程的资源占用(CPU, 内存等等)情况

namespace: 让每个进程组有独立的 PID, IPC 和网络空间

解决的痛点

打包部署

运行环境标准化

更加高效的利用物理机

docker 基本命令

容器的一个标准的生命周期包括:创建,启动,停止,终止和移除

docker pull busybox # 远程下载 images

docker run -it –rm –name busybox busybox # 创建容器,名称为 busybox

docker stop/kill busybox # 停止/强行停止 容器

docker start/restart busybox # 启动/重新启动 容器

docker rm busybox # 移除容器

常用命令

docker exec 可以运行 容器中的命令

docker cp 可以在主机和容器之间复制文件

docker inspect 查看容器的详细信息,也可以查看镜像详细信息

docker stats 容器的资源占用信息

docker events 返回 docker 主机上发生的所有 docker 事件流

docker logs 监控容器的日志

docker top 查看容器内运行的进程

docker 使用示例(busybox)

docker 容器是完全隔离的运行环境,但实际使用中,难免需要和外部或者 docker 容器进行交互。
比较常用的交互主要有 环境变量,磁盘,网络

环境变量

 

docker run -it --rm -e MY_NAME=wangyubin busybox env

 

外部的环境变量可以在容器启动的时候注入到容器中

磁盘

容器会共享镜像中的内容,容器自己的状态才会保存在磁盘上。

 

docker volume ls # 查看所有容器占用的磁盘名称
docker volume inspect VOL_NAME  # 查看具体的磁盘信息

 

容器中的文件,不会改变 image

在一个容器中创建文件(test.txt)

 

$ docker run -it --rm busybox
/ # touch test.txt
/ # ls
bin       etc       proc      sys       tmp       var
dev       home      root      test.txt  usr

 

重新启动的容器中是不包含这个文件的

 

$ docker run -it --rm busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var

 

容器挂载外部的文件系统

如果希望容器之间共享文件,或者将文件放在容器之外来管理,可采用如下方式 容器启动时挂载外部文件夹

 

docker run -it --rm -v /home/wangyubin/tmp/volume:/share-dir busybox
cd share-dir
touch test.txt

 

另一个容器也挂载这个文件夹

 

docker run -it --rm -v /home/wangyubin/tmp/volume:/share-dir busybox
/ # ls share-dir
test.txt

 

网络

容器中的服务默认只有当前容器可以访问,容器的宿主和其他容器都是无法访问的。

通过暴露端口,让宿主可以访问容器内服务

通过 nc 命令模拟一个服务

 

$ docker run -it -p 1234:1234 --rm busybox
/ # nc -l -p 1234

 

在宿主机上可以通过 docker ps 命令看到暴露的端口

 

docker ps

nc localhost 1234   # 连接上本地的 1234 端口,就可以和 docker 容器互发消息

 

容器创建在同一网络上

创建容器运行的网络,然后将 2 个容器启动到同一个网络上

 

$ docker network create test
a85b5589234b701b1237a364f7796b47e2d1ba4506740767c581a3d62d9e8f48

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a85b5589234b        test                bridge              local
... ...

 

启动第一个 docker,name 为 test01,并在容器中用 nc 命令模拟一个服务

 

$ docker run -it --rm --name test01 --network test busybox
/ # nc -l -p 1234

 

启动第二个 docker,name 为 test02,和 test01 在同一个网络上

 

$ docker run -it --rm --name test02 --network test busybox
/ # nc test01 1234
hello

 

由于在同一个网络上,可以通过 test01 这个名称直接连接另一个容器

启动第三个 docker,name 为 test03,使用默认的网络

 

$ docker run -it --rm --name test03 busybox
/ # nc test01 1234
nc: bad address 'test01'

 

由于 test03 和 test01 不在一个网络上,所以无法互通

链接:https://www.cnblogs.com/wang_yb/p/8625003.html

                                                     

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分