目录
镜像
容器
网络
构建dockerfile
构建docker-compose
镜像
镜像命令行帮助:
docker images help
复制
查看镜像:
docker images
复制
镜像仓库软件搜索:
docker search 镜像名称
复制
镜像拉取:
docker pull 镜像名称:1.11 //不加版本号则拉去最新的
复制
删除镜像:
docker image rm -f IMAGE ID //参数f代表强制删除,否则需要先stop容器运行
或
docker rmi -f IMAGE ID复制
运行镜像:
docker run -d -P --name mycontainer 4cb9110fasdw1 大写P表示会将EXPOSE暴露出来的端口随机映射到宿主机的端口上,如果没有暴露端口,就不会有映射;小写P表示指定映射
复制
容器
查看运行中的容器:
docker ps
复制
启动容器:
docker start IMAGE ID
复制
进入容器:
docker exec -it IMAGEID或 NAME /bin/sh //it表示以终端的方式进入,有时/bin/sh不行就用/bin/bash
复制
暂停容器:
docker stop IMAGEID
复制
查看容器日志:
docker logs IMAGEID //相当于cat
或
docker container logs -f IMAGEID //相当于在前台一直输出logs日志复制
同一个docker宿主机中不同容器之间通信:
下面有些步骤使用了自定义的桥接网络,需要先创建新的单机桥接网络,否则会报/usr/bin/docker-current: Error response from daemon: network ttt1 not found.
1、 创建容器时通过--network
指定相应的网络,或者通过 docker network connect
将现有容器加入到指定网络。然后获取到类似:"IPAddress": "172.17.0.3"的地址,然后直接填就好了
docker inspect 容器id | grep “IPAddress”
注意:此IP不是容器宿主机的IP,而是宿主机上容器ID的分配的容器IP复制
优点:是不用按照数据库提供服务顺序进行进行启动,不用取别名,较为简单
缺点:地址不是固定的,容器重启后ip地址会改变
2、 Docker DNS Server通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信。方法很简单,只要在启动时用 --name
为容器命名就可以了。
下面启动两个容器 bbox1 和 bbox2:
docker run -it --network=my_net2 --name=bbox1 busybox
docker run -it --network=my_net2 --name=bbox2 busybox
然后,bbox2 就可以直接 ping 到 bbox1 了
使用 docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的。
3、 通过宿主机的ip加上容器暴露出的端口号来通信
4、 通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器
docker run --name mysql -p 3306:3306 -v /mysql/database/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run -d -v /Docker:/usr/java/tomcat/apache-tomcat-8.5.27/webapps -p 8080:8080
--name MyTomcat --link mysql:aliasmysql javaweb:1.0 /root/run.sh
其中下面这个--link mysql是上面容器启动的名称复制
最后应用代码的配置文件数据库连接直接用aliasmysql:3306这样的就可以了
5、 joined 容器
joined 容器是另一种实现容器间通信的方式。
joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。请看下面的例子:
先创建一个 httpd 容器,名字为 web1。
docker run -d -it --name=web1 httpd
然后创建 busybox 容器并通过 --network=container:web1
指定 jointed 容器为 web1:
请注意 busybox 容器中的网络配置信息,下面我们查看一下 web1 的网络:
看!busybox 和 web1 的网卡 mac 地址与 IP 完全一样,它们共享了相同的网络栈。busybox 可以直接用 127.0.0.1 访问 web1 的 http 服务。
joined 容器非常适合以下场景:
不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。
网络
单机桥接网络:
在linux docker 主机上,默认的“brige”网络被映射到内核中为“docker0”的linux网桥。
从名称可以看出单机意味着该网络只能在单个docker主机上运行,并且只能与所在docker主机上的容器进行连接。在linux上网络名称为brige,除非在创建容器时指定参数--network,否则默认情况下,新创建的容器都会连接到名为brige的网络,如下所示查看:
⚡ root@server ~ docker network ls
NETWORK ID NAME DRIVER SCOPE
f0a727babf02 bridge bridge local
d6741be8a6b7 host host local
38b7261be9e3 none null local复制
docker默认“brige”网络和linux内核中的”docker0“网桥之间的关系如下图所示(Docker 安装时会创建一个 命名为 docker0
的 linux bridge):

通过docker network inspect brige
可以看到brige
网络的配置信息,原来 bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1,这个网关其实就是docker0。
容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的掩码保证有足够多的 IP 可以供容器使用。

新建桥接网络并使用:
docker network create -d brige localnet
docker run -d --name testnetwork --network localnet ba6b0bc975ec
docker run -d --name testrab --network localnet rabbitmq:3-management
docker network inspect localnet
brctl show
ifconfig复制
从下图可以看到,启动的两个容器的网络接口连接到了创建新桥接网络时自动创建的网桥br-6c66e0773373
(如果容器启动时没有指定,则会连接到docker0网桥)


多个容器创建后的容器网络拓扑结构:


容器创建时IP地址的分配:
Docker 创建一个容器的时候,会执行如下操作:
• 创建一对虚拟接口-网卡,也就是veth pair,分别放到本地主机和新容器中;
• 本地主机一端通过接口如 veth92a23e9连接到默认的 docker0 或指定网桥上
• 容器一端放到新容器中,并修改名字作为 eth0,这个网卡/接口只在容器的名字空间可见;
• 从网桥可用地址段中(也就是与该bridge对应的network)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth92a23e9。
完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。如果不指定--network,创建的容器默认都会挂到 docker0 上,使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。

多机覆盖网络:
暂略。。。
构建dockerfile
FROM golang:1.11 //基础镜像,就算依赖哪个镜像
LABEL MAINTAINER=“lujiahao” //作者
ENV GO111MODULE ON //环境变量
EXPOSE 8080 //暴露端口
WORKDIR /go/src/go-project //切换工作目录
COPY . . //把dockerfile文件目录当前的所有文件拷贝到工作目录
RUN go env -w GOPROXY=https://goproxy.cn,direct //执行命令
RUN go mod vendor
RUN go build -o go-projoect
CMD [ "bash". "-c", "/go/src/go-project/go-project;"] //启动容器时执行该命令复制
构建docker-compose
可以粗糙理解成Dockerfile是针对单容器的脚本,docker-compose是针对多Dockerfile的自动化脚本。如果是集群的话,首选k8s,docker swarm什么的编排引擎,毕竟docker-compose致命缺点仅限在单机上。
暂略。。