容器 镜像 仓库(默认是外国的仓库。一般配置阿里云的镜像仓库,每个人都不一样,自己注册!)
可以安装在c6.8以上的centos系统(c7 版本是docker-ce)
#按从一个陌生的服务器,部署自己的容器的逻辑整理的命令。
docker
历史#############
docker-ce 社区版本
docker 是还没商业化之前的版本。
docker-ee 是从17版本开始的。docker默认c7安装的是13版本的。从17年开始有的ee商业版本。
yum install docker-ce | docker| docker-ee 是有区别的的!!!!
看docker基础信息
docker -v #查看版本号
docker version # 查看详细版本信息,重点包括cc还是ce版本 (本身内部信息)
docker info #查看容器的运行详细信息##默认仓库地址(一般是配置相关的)(一般说的加速,就是换仓库,阿里云还要自己登陆注册,然后给一个唯一的url,本质都是仓库)
看镜像相关
查看镜像列表: 重点是本地镜像!
docker images
docker image ls
搜索镜像 :本地没有就是默认仓库搜索了
Docker Hub官网:https://hub.docker.com/
docker search + 镜像名字
##kubeadm安装初始化的时候哦,下载镜像找不到。使用命令也搜不到,这个时候搜索简短的名字,找到后去官网镜像仓库,查找tag标签去下载。
https://hub.docker.com/
看容器相关
docker ps 查看所有活动的容器 -a 会把停止的显示出来
docker inspect 容器名字 查看容器本身的详细信息
docker logs 容器名字 查看日志##所有的日志,会滚动很长时间,无法中断。 -f 显示部分最新的,实时更新
--tail n 比较常用!!!!!!!
导出,导入镜像:
docker image save centos > docker-centos6.9.tar.gz
导入镜像:
docker image load -i docker-centos6.9.tar.gz
当前目录有Dockerfile 此名字的文件!
文件编写格式略)
docker build -t nginx:test . #名字需要自己指定
#Dockerfile 文件理解:
1.理解它,就是我们要 修改一个微型的linux系统上运行软件的 小系统。
2.常用的关键字
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
不加后缀版本,就下载最新的。
轻量修改容器的参数:
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
添加文件到容器中,类似的COPY (不会自动解压tar包)
ENV myDog Rex
ENV myCat=fluffy
启动后的环境变量
EXPOSE <port> [<port>...]
只写一个端口=暴露给外面的端口,需要容器内部自己监听。
写两个端口=映射到节点上==启动时候 -p
重度修改:
WORKDIR /a (这时工作目录为/a)
配合执行脚本/命令的参数,使用。简单理解就是 cd
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
#执行容器内部有的命令,完成大量操作的作用。括号可以带也可以不带。
#可以写多个RUN 运行多次。
#格式: 命令 参数 |脚本 参数
注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache
CMD echo "This is a test." | wc -l
CMD ["/usr/bin/wc","--help"]
#同RUN 注意引号
注:CMD不同于RUN:只能用一次;CMD用于指定在容器启动时所要执行的命令,不能执行结束,要一直输出信息,不然容器就停了。
镜像重启,数据就恢复了。所以小修改可以提交为新的镜像。
docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
删除镜像: (删除容器取消image即可)
如何当前镜像有正在运行的容器,会提示报错。
docker image rm centos:latest
docker image rm 578c3
docker rmi -f image_ID 强制删除
#批量删除
docker rmi -f $(docker images | awk '{print $3}')
推送指定镜像到docker镜像源服务器(默认从官方仓库获取)
(docker login #需要先登录仓库)
一般会tag一个带ip的标签给镜像,会重新复制一份,如果不带版本,默认latest,没有此版本会报错。
然后直接用命令推送
docker tag nginx:latest 10.0.0.11:80/nginx:latest
docker pull daocloud.io/huangzhichong/alpine-cn:latest 拉(不写地址就是默认官方下载)
docker push 10.0.0.11:80/nginx:latest 推
显示一个镜像的历史
docker history image_name
#可以查看镜像详细的信息,包括启动命令的详细参数。
docker image history 39f8d6036406 --no-trunc |grep 39f8d6036406
#查看docker启动命令,环境变量等参数。
docker inspect 39f8d6036406
#这里查看容器的运行状态,详细的构造信息,还是看inspect
kubectl describe pod djangoblog-664b9c97b6-kgflx
#镜像不能直接修改,所以没有修改命令
容器相关
#容器是一个程序,是从镜像启动的。一个镜像如果没有一直执行的程序,容器启动并执行完后就会关闭。
每个容器都是一个微型root文件系统,支持bash登录。
一旦创建容器,就会生成容器的文件。而且会越来越多。记得用容器命令清理不用的容器。
(从创建到删除的逻辑分析)
创建
( it 参数 接收用户输入+伪终端 为后期用户登录容器的作用。)
docker create -it ubuntu:latest
docker start af #名字是容器的名字或容器id的前缀都可以
==docker run ubuntu:18.04 /bin/echo 'Hello World'
docker run -p 80:80 -v /data:/data -d nginx:latest #附带端口转发和本地目录
docker run -d -it --name busybox_2 --link busybox_1 busybox /bin/sh -c “while true;do sleep 3600;done” #link命令一般都会重新定义容器为另一个名字,只能自己识别,并且是单向的。
#一般是-itd参数 d是后台运行,不会应为操作的终端退出而终止。
docker rm 容器名字
docker stop 容器名字
docker start 容器名字
操作容器-登录,查看,修改
#官方推荐 多终端同时登录,会自动同步,一旦一个终端卡住,所有无法使用
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
常用登录方式
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
docker exec -it 243c32535da7 /bin/bash
#容易混淆的概念 run针对的是镜像 exec是容器。第一次创建容器的时候可以用run进入容器。之后再用这个命令就是重复创建并进入。
exec 就是进入容器
#因为都是bash 的界面容易混淆。run后面不写会有默认的启动命令,但是exec不写就报错。
后面可以直接写 容器里面有的命令,直接操作容器。
docker run -it nginx:latest /bin/bash
docker exec -it 243c32535da7 /bin/bash
docker cp 文件 容器id:目录 直接拷贝文件。不能用*,会报错。
多容器启动程序,一般不用,k8s代替
使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
############################################################################network
加入同一网络的容器,互ping 主机名是可以通的。(如何不加入网络,只能靠自己的ip通信)
docker network create -d bridge test-net
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
docker network ls
登录容器,互ping是可以通的。
#跨主机通信:
把自己的端口映射给宿主机(最简单!)
直接路由模式:修改docker0网卡,为不同的网段,增加相互路由通信。
pipework 第三方工具 桥接网络。
隧道网络,和k8s类似。
网络差,使用其他镜像下载:
pip install multiprocessing -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com