基本概念

基于GO语言
软件容器化
docker是一个装应用的容器(类似于虚拟机高于虚拟机)

解决痛点:

  1. 解决运行环境不一致的问题
  2. 每个容器独立不影响
  3. 增加容器更加简便
  4. 不用记录存储位置
  5. 启动速度显著增加

时势造英雄:

统一云计算/敏捷开发(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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐