容器基本知识
搭建环境
镜像
基本操作
1.查看镜像:docker images
2.从registry下载镜像(默认的源是Docker Hub):docker pull [USERNAME/]IMAGE[:tag]
3.查看某个镜像构建的层次:docker history IMAGE
4.为镜像命名:docker tag [old_repositry]:[old_tag] [new_repositry]:[new_tag]
5.上传镜像到Docker Hub上: docker push [USERNAME]/repositry:tag
注:上传前要登陆:docer login -u USERNAME
6.删除Docker host中的镜像:
1.删除一个镜像:docker rmi IMAGE
2.删除全部镜像:docker rmi $(docker images -q)
镜像无法删除解决办法
1.若某些镜像对应的容器处于run状态或者处于stop状态,则不能删除镜像。
解决办法:删除镜像对应的容器:rm
2.若两个镜像的IMAGE ID一样,这不能删除全部镜像。
解决办法:逐个删除镜像。
7.搜索Docker Hub中的镜像: docker search IMAGE
内部结构
Dockerfile是镜像的描述文件。构建Dockerfile的一些指令:
1.FROM IMAGE:表示以IMAGE为基础,从而构建构建更高层次的镜像。
例:FROM scratch:不以任何镜像为基础。
注:一般以base镜像为基础:Ubuntu,Debian,CentOS
2.ADD: 从build context复制文件到镜像。若文件时压缩包,则自动解压。
3.COPY:将build context中复制文件到镜像。
1.COPY src dest
2.COPY ["src", "dest"]
注:src只能是build context中的文件或目录。
4.ENV:设置环境变量
例如:ENV MY_VERSION 1.3
RUN apt install -y mypackage=$MY_VERSION (MY_VERSION被替换成1.3)
5.EXPOSE:指定暴露的端口。
6.WORKDIR:指定容器当前的工作目录。
7.RUN:运行特定的指令。
8.CMD:容器启动时运行的指令,多个指令只有最后一个生效。CMD能被RUN参数替换。
9.ENTRYPOINT:跟CMD一样,不一样的时CMD 和 docker run后的参数会传给ENTRYPOINT。不会被RUN后参数替换。
注:DOCERFILE有两种模式:Shell和Exec模式。
1.shell模式:<instruction> <command>
2.exec模式:<instruction> ["executable", "param1", "param2", ...]
10.MAINTAINER:镜像的作者。
构建镜像
1.docker commit 命令
构建步骤:
1.运行容器
例如:docker run -it --name=ubuntu_test ubuntu
2.修改容器
例如:apt install -y vim
3.保存为新的镜像
例如:docker commit ubuntu_test ubuntu-vim
2.dockerfile 构建文件
docker built -t IMAGE_NAME .
注:-t表示打一个tag标签。
容器
基本操作
1.启动容器:
1.docker run [OPTIONS] IMAGE [COMMAND]:创建并运行容器。
例如:docker run -d -p 80:80 httpd
-d:以后台方式运行
-p:指定端口
2.docker create IMAGE: 只创建容器,不运行。
2.查看正在运行的容器:
1.docker ps
2.docker container ls
3.指定容器名字:--name "CONTAINER_NAME"
4.进入容器的方法:
1.docker attach CONTAINER_NAME:进入容器,不能创建新进程
2.docker exec CONTAINER_NAME op:进入容器,可以创建新进程。
5.查看容器的输出:docker log -f CONTAINER
6.停止正在运行的容器:
1. docker stop/kill CONTAINER:占用CPU
2. docker pause CONTAINER: 不占用CPU
7.运行处于停止状态的容器:
1. docker start CONTAINER
2. docker unpause CONTAINER
8.重启容器:
1.restart = stop + start
2.--restart=always:无论容器何种原因退出,立即重启容器。
3.--restart=on-failure:3,若启动的进程退出并返回非0值,最多重启3次
9.重启容器:
docker rm CONTAINER
参考容器操作图
容器的资源限制
1.内存限制:
1. -m 或 --memory: 随着之内存的使用限额。
例如: -m 300M
2.--memory-swap: 内存+swap的使用限额。
例如:-memory-swap 400M
2.CPU限制:-c 或 --cpu-shares
例如:docker run --name "NAME1" -c 1024 IMAGE
docker run --name "NAME2" -c 512 IMAGE:表示1号容器使用CPU时间是2号容器的2倍。
注:--cpu 1:表示有1颗CPU
3.限制磁盘读写速度:--blkio-weight
例如:docker run -it --name CONTAINER_A --blkio-weight 600 IMAGE
docker run -it --name CONTAINER_B --blkio-weight 300 IMAGE
注:
--device-read-bps
,限制读某个设备的 bps。 --device-write-bps
,限制写某个设备的 bps。 --device-read-iops
,限制读某个设备的 iops。 --device-write-iops
,限制写某个设备的 iops。
例如:docker run -it --device-write-bps /dev/sda:30MB IMAGE:限制对设备的写速度不超过30MB
网络
none网络
--network=none : 表示除了lo网卡(ip=172.0.0.1,用于回环测试),没有其他任何网卡。一般用在高机密的应用中。
例如:docker run -it --network=none ubuntu /bin/sh
host网络
--network=host:表示与主机host分享ip。
bridge网络
不指定network表示创建一个新的网络接口,挂到docker0上。图
网桥操作
1.查看网桥名以及接口:brctl show
2.查看网桥的详细信息(包括ip):docker network inspect BRIDGE
自定义(user-defined)网桥
1.创建一个自定义的网络驱动:docker network create --driver bridge my_net
2.指定自定义网桥的ip网段(sub-net)以及网关(gateway):--subnet和--gateway
3.使用自定义的网桥:--network=MY_NET
4.使用自定义网桥时指定静态ip:--ip。注意:只有指定--sub_net才能指定静态ip。
两个容器间的通信
两个容器若要通信,必须要有属于同一网络的网卡。
1.在一个容器中创建一个网卡,挂在MY_NET上:docker network connect MY_NET CONTAINER图
2.docker的自定义网络自带DNS Sever服务,因此可以将ip换成容器名进行通信:
docker run -it --network=MY_NET --name=CONTAINER IMAGE
注:bridge网络没有DNS Server功能。
3.使用joined容器方法让两个容器共享网卡信息和配置信息:
docker run -it --network=container:CONTAINER IMAGE,这样新产生的容器可以共享CONTAINER的网络信息。
好处:可以使用lo的ip地址让两个容器通信。