docker1-docker常用命令|Dockerfile|网络类型
基本概念基于GO语言软件容器化docker是一个装应用的容器(类似于虚拟机高于虚拟机)解决了什么问题:运行环境不一致的问题每个容器独立不影响(LXC容器虚拟化-linux下)增加容器简便不用记录存储位置启动速度慢时势造英雄:统一云计算/敏捷开发(PaaS平台即服务,平台提供了存储,数据库,网络,负载均衡,自动扩展的功能)架构图将软件或web应用build构建出镜像&...
基本概念
基于GO语言
软件容器化
docker是一个装应用的容器(类似于虚拟机高于虚拟机)
解决痛点:
- 解决运行环境不一致的问题
- 每个容器独立不影响
- 增加容器更加简便
- 不用记录存储位置
- 启动速度显著增加
时势造英雄:
统一云计算/敏捷开发(PaaS平台即服务,平台提供了存储,数据库,网络,负载均衡,自动扩展的功能)
架构图
将软件或web应用build构建出镜像>>>ship运输>>>>run运行中的镜像叫容器
宿主机host:
守护程序daemon
镜像image:(集装箱)存储格式:联合文件系统,分层,只有最顶层是可写的
容器container: 一个进程,想象为虚拟机(OOP思想:镜像是类,容器是对象,只有在镜像run后才能叫容器)
仓库registry:国外仓库太慢,国内网易蜂巢 c.163.com
download> and config>
mac下载 官网下载dmg文件
centos下安装 教程 http://www.runoob.com/docker/centos-docker-install.html
把用户放docker组 sudo usermod -aG docker zhaojianyu
问题解决 :
https://blog.csdn.net/zxzxzxzx2121/article/details/61914870
http://www.runoob.com/docker/docker-hello-world.html
config:设置阿里云镜像仓库
Registry操作
国内仓库:daocloud/时速云/aliyun
镜像redis的检索
docker search redis
镜像的下载(从仓库)
docker pull [options] name[:tag]
实例:
docker pull redis
构建自己的镜像之后提交到远程仓库 hub.docker.com
docker login
docker push 镜像名
image镜像操作
查看本地镜像列表
docker images
删除镜像
docker rmi 镜像id
删除所有镜像
docker rmi ${docker images -q}
镜像保存/载入: docker load/docker save
;将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
container容器操作
容器导入/导出:docker import/docker export;将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。
运行容器
# 【返回唯一id标识】 -d后台运行
# -H 设置远程访问 -H tcp://0.0.0.0:2375
docker run -p 8080:80 --name 容器名 -d 镜像名
docker run -d -p 8080:80 hub.c.163.com/library/nginx
在运行的容器上拷贝文件(host宿主上与container容器之间)
docker cp index.html 容器id://usr/share/nginx/html
保存修改的镜像(产生新的镜像)
docker commit -m '提交注释' 容器id nginx-name
查看正在运行的容器/查看运行的和停止的容器
docker ps
-a :显示所有的容器,包括未运行的。
-q :静默模式,只显示容器编号。
-n 5 :列出最近创建的5个容器。
#查看容器内进程
docker top 容器名
启动容器///停止容器
docker stop 容器名/或容器id
docker start 容器名/或容器id
重启容器
docker restart
在容器里运行命令
docker exec -it 容器id或容器名 /bin/bash
删除容器
docker rm 容器id 来删除一个终止状态的容器;若要删除一个运行中的容器,需要加-f参数。
查看容器日志
docker logs -f 容器id
docker file创建镜像(常用,自创镜像)
第一个docker file
文件名:Dockerfile /约定成俗/
# 基础镜像 alpine 专门为docker做的极小的linux环境
FROM alpine:latest
# 告诉其他人作者
MAINTAINER zhaojianyu 1045152332@qq.com
# RUN命令shell模式和exec模式
RUN echo -h hello
RUN["/bin/bash","-c","hello"]
# 执行命令
CMD echo 'hello lcy'
构建 -t 镜像名 .(这里有个点)路径名
docker build -t hello_docker .
执行过程
Dockerfile指令:
FROM 基础镜像
RUN 构建时执行命令
ADD 复制文件 能够解压tar
COPY 拷贝文件,单纯复制文件 推荐copy
CMD 容器运行时执行命令,使用类似RUN 但是docker run命令后面有命令会覆盖dockerfile中cmd
EXPOSE 暴露端口
USER
1 格式
USER [:] or
USER [:]
2 作用
指定运行时的用户名或UID,后续的RUN也会使用指定的用户。
当服务不需要管理权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
3 说明
要临时获取管理权限可以使用gosu,而不推荐sudo。
WORKDIR
1 格式
WORKDIR /path/to/workdir
2 作用
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数时相对路径,则会基于之前命令指定的路径。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为/a/b/c
ENTRYPOINT与cmd类似 ,但是不会被docker run覆盖
docker网络
先介绍两个重要概念:
veth设备全称为Virtual Enternet device,veth主要的目的是为了跨Network Namespace之间提供一种类似于Linux进程间通信的技术,所以veth总是成对出现的,例如veth0@veth1等等,其中veth0在一个Network Namespace内,而另一个veth1在另外一个Network Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去,veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容。
网络命名空间是用于隔离网络资源(/proc/net、IP 地址、网卡、路由等)。由于一个物理的网络设备最多存放在一个网络命名空间中,所以通过 veth pair 在不同的网络命名空间中创建通道,才能达到通信的目的。
docker五种网络模式
- Bridge模式
- Host模式
- Container模式
- None
- overlay
安装完docker之后,宿主机上会创建三个网络,查看Docker Network:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
00e34fdf4b62 bridge bridge local
6758c4f79015 host host local
e040e124e081 none null local
Bridge 模式
Bridge模式是Docker默认的一种网络通信模式,Docker Daemon第一次启动时,会在其所在的宿主机上创一个名叫docker0的虚拟网桥。Docker 利用veth pair技术,在一个容器启动时,会创建一对虚拟网络接口veth pair,Docker会将一端挂载到虚拟网桥docker0上,而将veth pair的另一端放在相关容器的Network Namespace内。
在Bridge模式下是通过iptables控制容器与Internet通信、以及容器间通信的。docker0网桥会为每一个容器分配一个新的 IP 地址,并将 docker0 的 IP 地址设置为默认的网关。网桥docker0 通过 iptables 中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过iptables 转发到 docker0 并由网桥分发给对应的机器。
Host网络模式
Docker Container中的host模式与bridge桥接模式有很大的不同。最大的区别当属,host模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的Docker Container会和host宿主机共享同一个网络namespace,拥有与主机相同的网络设备,故Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的IP地址即为宿主机eth0的IP地址
1bridge(默认的模式)独立的network namespace
2host -p -P开放所有端口并随机
3none
docker启动命令,docker重启命令,docker关闭命令
启动 systemctl start docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
关闭docker systemctl stop docker
更多推荐
所有评论(0)