docker command

docker可以给镜像做端口映射

基本的命令是 -P(大写)  :Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口

基本的命令是-p(小写的P):Docker则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。

支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

docker run -d -p 80:8080 tomcat:7.0.55   //本地的80端口到容器的8080端口(所有地址)

docker run -d -p 127.0.0.1::8080/udp tomcat:7.0.55 //127地址的随机端口到容器的8080端口(UDP协议)

可以通过port指令查看内部端口的映射信息

[[email protected]_0 ~]# docker port a65f82f9b142 80
0.0.0.0:8081

当Docker启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段( 172.17.0.0/16 )的地址。

当创建一个Docker容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI 2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker就创建了在主机和所有容器之间一个虚拟共享网络

11.把镜像的依赖关系绘制成图

docker images命令有一个很拉风的选项:-viz,可以把镜像的依赖关系绘制成图并通过管道符号保存到图片文件:


# 生成一个依赖关系的图表

$ docker images -viz | dot -T png -o docker.png

这样,主机的当前路径下就生成了一张png图,然后,用python开启一个微型的HTTP服务器:


python -m SimpleHTTPServer

然后在别的机器上用浏览器打开:


http:     //machinename     :8000     /docker     .png

OK,依赖关系一目了然!

(译者注:要使用dot命令,主机要安装graphviz包。另外,如果主机ip没有绑定域名,machinename换成主机的ip即可。)

12.Docker把东西都存到哪里去了?

Docker实际上把所有东西都放到/var/lib/docker路径下了。切换成super用户,到/var/lib/docker下看看,你能学到很多有趣的东西。执行下面的命令:


     sudo      su

# cd /var/lib/docker

# ls -F

containers/ graph/ repositories volumes/

可以看到不少目录,containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样你就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如 何一层一层叠加起来的。

13.Docker源代码:Go, Go, Go, Golang!

Docker的源代码全部是用Go语言写的。Go是一门非常酷的语言。其实,不只是Docker,很多优秀的软件都是用Go写的。对我来说,Docker源文件中,有4个是我非常喜欢阅读的:

commands.go

docker的命令行接口,是对REST API的一个轻量级封装。Docker团队不希望在命令中出现逻辑,因此commands.go只是向REST API发送指令,确保其较小的颗粒性。

api.go

REST API的路由(接受commands.go中的请求,转发到server.go)

server.go

大部分REST API的实现

buildfile.go

Dockerfile的解析器

有的伙计惊叹”Wow!Docker是怎么实现的?!我无法理解!”没关系,Docker是开源软件,去看它的源代码就可以了。如果你不太清楚Dockerfile中的命令是怎么回事,直接去看buildfile.go就明白了。

14.运行几个Docker后台程序,再退出容器,会发生什么?

OK,倒数第二个要点。如果在Docker中运行几个后台程序,再退出Docker容器,会发生什么?答案是:不要这么做!因为这样做后台程序就全丢了。

Dockerfile中用RUN命令去开启一个后台程序,如:


RUN pg_ctl start

这样的话,RUN命令开启的后台程序就会丢失。调用容器的bash连到容器的shell:


$ docker run -i -t postgresimage      bash

然后调用 ps aux查看进程,你会发现postgres的进程并没有跑起来。 RUN命令会影响文件系统。因此,不要再Dockerfile中用启动后台程序,要把后台程序启动成前台进程。或者,像一些高手提议的那样,写一个启动脚 本,在脚本中启动这些后台程序或进程。

15.容器之间进行友好沟通:链接

这是最拉风的功能!我把它留到最后压轴!这是0.6.5中最重要的新功能,我们前面已经提过两次了。运行一个容器,给它一个名称,在下面的例子中,我们通过-name参数给容器指定名称”loldb”:


$ docker run -d -name loldb loldbimage

再运行另一个容器,加上-link参数来连接到第一个容器(别名为loldb),并给第二个容器也指定一个别名(这里用的是cheez):


$ docker run -link      /loldb     :cheez otherimage      env

顺便得到cheez的环境变量:


CHEEZ_PORT=tcp:     //172     .17.0.8:6379

CHEEZ_PORT_1337_TCP=tcp:     //172     .17.0.8.6379

CHEEZ_PORT_1337_TCP_ADDR=tcp:     //172     .17.0.12

CHEEZ_PORT_1337_TCP_PORT=6379

CHEEZ_PORT_1337_TCP_PROTO=tcp

这样,我们就在两个容器间建立起一个网络通道(bridge),基于此,我们可以建立一个类似rails的程序:一个容器可以访问数据库容器而不对外暴露其他接口。非常酷!数据库容器只需要知道第一个容器的别名(在本例中为cheez)和要打开的端口号。所以数据库容器也可以env命令来查看这个端口是否打开。

时间: 2024-10-11 22:07:56

docker command的相关文章

这20个Docker Command,有几个是你会的?

在这之前呢,也写过两篇关于Docker基础入门类的文章 Docker容器技术入门(一) Docker容器技术入门(二) 很多人都感觉这文章这么简单.这么基础,可是别忘记了"万丈高楼平地起",如果少了这个平地址,你这高楼估计也起不了.所以,基础是学习任何一门技术或者一个技术点的重中之重,也可以说是很关键的决胜点. 所以呢,今天,民工哥给大家总结了这20个Docker Command,愿各位小伙伴在通往"玩转Docker"路上不再无助!!!! 安装完成docker容器服

Docker command learning

docker run -d -p 80:80 nginx ---启动一个容器 docker images\image list\image ls 查看本地镜像 docker rm docker ps -a -q 删除运行的镜像 docker rm ID/NAME 删除容器-运行中的无法删除 docker ps -a 查看已经创建的容器 docker search centos 查询公共可用仓库 docker search alpine -查询镜像 docker pull centos 下载镜像

docker [OPTIONS] COMMAND

Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Options: --config string      Location of client config files (default "/home/sinao/.docker") -D, --debug              Enable debug mode -H, --host list          Daemon soc

Docker源码解读:1.flag解读

我是怎么想到要先看docker中的flag呢,就是因为docker采用了c/s结构,而且daemon和client都是用同一个程序的,因此,为了做出区分,肯定是要用参数来区分的.先来看位于./docker/docker/docker.go下面的main函数代码: func main() { //第一次肯定是返回false的,因为没有任何initializer if reexec.Init() { return } // Set terminal emulation based on platfo

Docker 学习笔记

一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 – Docker Hub Docker 使用客户端-服务器 (C/S) 架构模式.Docker 客户端会与 Docker 守护进程进行通信.Docker 守护进程会处理复杂繁重的任务,例如建立.运行.发布你的 Docker 容器.Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker

Docker容器基础知识学习

Docker作为操作系统层面的轻量级的虚拟化技术,凭借简易的使用.快速的部署以及灵活敏捷的集成等优势,迅速发展目前最为火热的技术. 1.云计算服务是一种资源管理的资源服务,该模式可以实现随时随地.便捷按需地配置资源共享池中获取所需的资源. 2.Docker是以docker容器为资源分割和调度的基本单位,分装整个软件运行时环境,为开发者和系统管理员所设计,用于构建.发布和运行分布式应用的平台. 3.Docker是一个轻量级虚拟化技术,更简易的安装和使用方式.服务集成与开发流程自动化. 4.Dock

Jenkins+docker实现应用发布

Jenkins:centos6.5 ip:192.168.83.84 Docker:centos7.2 ip:192.168.83.60 一.安装Jenkins 最新版: sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key sudo

非常详细的 Docker 学习笔记

一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docker Hub Docker 使用客户端-服务器 (C/S) 架构模式.Docker 客户端会与 Docker 守护进程进行通信.Docker 守护进程会处理复杂繁重的任务,例如建立.运行.发布你的 Docker 容器.Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker

docker讲解和命令汇总

docker 什么是docker? Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源(可以商业). Docker项目的目标是实现轻量级的操作系统虚拟化解决方案. Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等.由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机VM额外的操