docker学习
下面是借用其他大佬的图片,内容是笔记😅,可能时间有点久了,有些内容也更新了,仅供参考。
中文文档:docker_practice.gitee.io/zh-cn
docker hub 搜索镜像
docker 镜像加速 阿里 容器服务 镜像加速器
docker run 运行容器
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷;
docker images 查看
docker pull mysql:5.6.50 下载镜像
docker search redis 搜索镜像
docker save 备份镜像
docker save centos (images id)Ubuntu:14.04 -o\> linux2.tar
docker load -i 文件
docker tag :docker tag 453a Ubuntu:latest 最新版本 文件重命名
docker image inspect/docker inspect:详细信息查看 -f {{}}
docker history
docker create -ti centos python 启动Python终端
docker image rm ID号
docker rmi 卸载
docker rm -f $(docker ps -aq) 删除所有容器
docker logs id 日志查看,其实是命令的输出
docker ps
宿主机端口与容器中的端口进行映射 -p
docker run -p 8080(系统外部端口):8080(容器内服务监听的端口)tomcat:TAG 版本
-d 后台运行
docker start -ai Python 启动是加-ai
docker run -ti Python ;run -d 容器在后台运行,-t分配虚拟终端,输入数据用-i
docker stop -t 3 id -t 可以指定停止的等待时间
docker kill id 建议使用stop
docker pause id 暂停状态
docker unpause id
docker restart id 重启
docker inspect -f {{json .sm}} id 查看详细信息
docker rename id
docker attach id 容器连接 exit退出容器;进入的是主进程
docker exec -ti Python 容器中执行新命令;连接的是子进程,没有进入到Python主进程,用的多
docker commit 根据容器生成一个新的镜像
docker export 把镜像打包为一个tar文件
docker import
容器与镜像
网络管理:
docker network ls 查看网络
docker network create创建网络
网络模式:bridge host null overlay macvlan
docker network rm 删除网络
docker network inspect 查看信息
docker run --network my-bridge -dti centos bash 使用网络
docker network connect/disconnect 连接网络
bridge网络模式特点:
宿主机上需要单独的bridge网卡,如默认docker默认创建的dockerO。
容器之间、容器与主机之间的网络通信,是借助为每一个容器生成的一对veth pair虚拟网络设备对,进行通信的。一个在容器上,另一个在宿主机上。
每创建一个基于bridge网络的容器,都会自动在宿主机上创建一个veth**虚拟网络设备。
外部无法直接访问容器。需要建立端口映射才能访问。容器借由veth虚拟设备通过如dockerO这种bridge网络设备进行通信。
每一容器具有单独的IP
host网络模式:
容器完全共享宿主机的网络。网络没有隔离。宿主机的网络就是容器的网络。
容器、主机上的应用所使用的端口不能重复。例如:如果宿主机已经占用了8090端口,那么任何一个host模式的容器都不可以使用8090端口了;反之同理。
外部可以直接访问容器,不需要端口映射。容器的IP就是宿主机的IP
overlay网络模式:
Overlay网络,也称为覆盖网络。
Overlay 网络的实现方式和方案有多种。Docker自身集成了一种,基于VXLAN隧道技术实现。
Overlay 网络主要用于实现跨主机容器之间的通信。
应用场景︰需要管理成百上千个跨主机的容器集群的网络时。
数据卷的特点:
数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中容器对数据卷的修改是实时进行的。
数据卷的变化不会影响镜像的更新。
数据卷是独立于联合文件系统,镜像是基于联合文件系统。
镜像与数据卷之间不会有相互影响。
bind方式绑定数据卷
docker run -dti -v /root/volume_dir: /root/c_dir centos 映射到/root/c_dir 绝对路径
方式一:-V,--volume参数
-v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
方式二:--mount参数
--mount type=bind, src=宿主机文件或文件夹路径, dst=容器中的文件或者文件夹路
src 指定文件的路径必须提前创建或存在
volume方式:用的最多
利用docker run/create为容器挂载数据卷用法︰
方式一: -V,--volume参数
-v VOLUME-NAME:容器中的文件或者文件夹路径
方式二: --mount参数
--mount type=volume, src=VOLUME-NAME, dst=容器中的文件或者文件夹路径
volume对象管理︰
docker volume命令管理volume数据卷对象
docker volume create 创建数据卷对象
docker volume inspect 查看数据卷详细信息
docker volume ls 查看已创建的数据卷对象
docker volume prune 删除未被使用的数据卷对象
docker volume rm 删除一个或多个数据卷对象
tmpfs mount 方式挂载数据卷
利用docker run/create为容器挂载数据卷
用法 --mount type=tmpfs,dst=PATH
共享其他容器的数据卷-数据卷容器
利用docker run/create的--volumes-from参数指定数据卷容器
用法∶docker run/create --volumes-from CONTAINER
Docker的数据卷更多会是使用volumes方式来进行使用。使用时需注意︰
如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。
如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。
这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容
掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。
docker 仓库
docker push需要FQ
无认证的私有仓库:
第一步∶在需要搭建仓库的服务器上安装docker。
第二步:在服务器上,从docker hub下载registry仓库
docker pull registry (默认封装有web服务)
第三步:在服务器上,启动仓库
docker run -d -ti --restart always--name my-registry -p 8000:5000 -v /my-registry/registry:/var/lib/registry registry
通配置下面的文件进行https传输
/etc/docker/daemo.json 添加:“insedure-registries":[“服务器IP:端口”]
通过curl 进行查看文件 curl ip:8000/v2/_catalog
第一步:利用docker tag重命名需要上传的镜像
docker tag IMAGE服务器IP:端口/IMAGE_NAME
第二步∶利用docker push上传刚刚重命名的镜像
docker push服务器IP:端口/centos
必须重命名为服务器IP:端口/IMAGE_NAME
带认证的私有仓库:
在服务器上:
第一步︰删除先前创建的无认证的仓库容器
docker rm -f my-registry
rm -rf my-registry(可以不删除,用新建的仓库去继承)
第二步:创建存放认证用户名和密码的文件:
mkdir /my-registry/auth -p
第三步︰创建密码验证文件。注意将将USERNAME和PASSWORD替换为设置的用户名和密码
docker run --entrvpoint htpasswd registry -Bbn USERNAME PASSWORD > /my-registry/auth/htpasswd
第四步:重新启动仓库镜像
docker run -d -p 8000:5000 --restart=always --name docker-registry \
-v /my-registry/registry:/ar/lib/registry \
-v /my-registry/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htp.asswd" \
registry
第─步:首先登录到服务器
docker login -u username -p password 47.94.153.230:8000
第二步:然后执行pull或者push命令
第三步:操作完毕后,可以退出登录
dokker logout 47.94.153.230:8000
构建镜像:在Dockerfile存在的文件夹下通过 docekr build . -t image-name
dockerfile:
vi Dockerfile 创建一个文件:
FROM centos 指定版本
RUN echo‘这是一个测试’ 运行命令
docker build /root/dcokerfile-dir -t test-image:v1.0
文件夹改名后也是可以用的
-f 特指一个Dockerfile文件,改名后
运行:
docker build . -f dcokerfile-dir/test-df -t test-image:v1.0
在dockerfile中如果命令改变则后面的都要执行一变,前面的不会;
如果是最后一句的话,就只执行最后一句,其他不执行;
k8s百度
查看官方的Dockerfile : https://github.com/docker-library/docs
dockerfile命令:
FROM:指定基础镜像
RUN:构建镜像过程需要执行的命令。可以有多条。
CMD∶添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖修改。ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
LABEL:为镜像添加对应的数据。
MAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。EXPOSE∶设置对外暴露的端口。
ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失。
ADD∶将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件COPY:将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:添加数据卷
USER:指定以哪个用户的名义执行RUN,CMD和ENTRYPOINT等命令WORKDIR:设置工作目录
官网:docs.docker.com
用shell会是子进程,用exec的话是当前终端进行,会退出当前进程
ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令、
STOPSIGNAL:设置容器退出时发出的关闭信号。
HEALTHCHECK:设置容器状态检查。
SHELL∶更改执行shell命令的程序。Linux的默认shell是["/bin/sh”, “-c” ],Windows的是[ "cmd", "/S”, "/C”]。
Docker for Mac与Docker for Windows自带docker-composeLinux下需要单独安装:
第一步: sudo curl-L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s-$(uname-m) -o /usr/local/bin/docker-compose
第二步:sudo chmod +x /usr/local/bin/docker-compose终端中使用docker-compose --version查看安装的版本
这里示例安装版本是1.21.2,很可能您看到这里时,已经出现更新的版本,因此建议换成最新版本。
docs.docker.com/compose/install/#install-compose
Docker Compose File 顶级配置项:
. version :指定Docker Compose File版本号
. services :定义多个服务并配置启动参数
. volumes :声明或创建在多个服务中共同使用的数据卷对象
. networks :定义在多个服务中共同使用的网络对象
. configs :声明将在本服务中要使用的一些配置文件
. secrets :声明将在本服务中要使用的一些秘钥、密码文件
. x-***:自定义配置。主要用于复用相同的配置。
github上的docker-library
1.compose作用
作用: compose以项目为核心,在项目中定义一组具有相同业务逻辑单元 服务运行概念:
service服务:—个服务代表容器
project 项目:定义一组具有相同业务逻辑单元服务(容器)--->docker-compose.yml
2.模板命令
docker-compose. yml
version: ""#官方网址:https : / /docs.docker.com/engine/reference/builder/支持3.8
services : #用来书写当前项目中哪些容器服务
tomcat ;
image: tomc at : 8 .o-jre8#指定使用镜像 image:tag
container_name: tomcat #指足后动时容器名栋...--name
ports : #指定容器端口与宿主机瑞口映射-p
-"8080:8080"
volumes : #指定容器中哪个路径与宿主机中路径进行数据卷映射-v
- /root / apps : /usr / local/tomc at /webapps
- tomc atwebapps : /usr / local/tomc at /webapps
networks : #指定容器启动之后使用哪个网桥--network
- aa
cmd : redis-server l ....#用来覆盖容器默认启动指令
envoriment :
#用来指定容器启动时环境参裁
- MYsQL_ROoT_PASSwORD=root
volume :
tomc atwebapps :
external:
true
networks:
aa :
external:
true
depends_on: #代表这个容器必须依赖哪些容器启动之后才能启动
- tomcat02
模板:
version: "3.2"
services :
tomcat01:#服务名称
container_name: tomcat01 #相当于run 的--name
image: tomcat: 8.0-jre8 #使用哪个镜像相当于run image
ports:#用来完成host与容器的端口映射关系―相当于run -p
- "8080:8080"
volumes:#完成宿主机与容器中目录数据卷共享相当于run -v
#一 /root/apps :/usr/local/tomqat/webapps#使用自定义路径映射
- tomcatwebappso1 :/usr/ localttomcat/ webapps
networks: #代表当前服务使用哪个网络桥相当于run --networ
- hello
tomcat02:#服务名称
container_name: tomcato2
image: tomcat :8.o-jre8 #使用哪个镜像
ports:#用来完成host与容器的端口映射关系- "8081:8080"
volumes:#完成宿主机与容器中目录数据卷共享
#- /root/apps : /usr/local/tomcat/webapps#使用自定义路径映射
- tomcatwebapps02 :/usr/ local/tomcat/ webapps
networks:#代表当前服务使用哪个网络桥
- hello
mysq1 :
image : mysql: 5.7.32
container_name: mysql
ports:
- "3307:3306"
volumes :
- mysqldata :/var/ lib/mysql- mysqlconf : / etc/ mysql
environment:
- MYSQL_ROOT_PASswORD=root
networks:
- hello
redis:
image: redis:5.0.10
container _name : redis
ports :
- "6379: 6379"
volumes:
- redisdata:/ data
networks:
- hello
command: "redis-server --appendonly yes"#run镜像之后用来覆盖容器内容默认命令
volumes:#声明上面服务所使用的自动创建的卷名
tomcatwebapps01:#声明指令的卷名compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名
false #true确定使用指定卷名注意:一旦使用外部自定义卷名启动服务之前必须手动创建
tomcatwebapps02:
mysqldata:
mysqlconf:redisdata:
networks:#定义服务用到桥
hello:#定义上面的服务用到的网桥名称默认创建就是 bridge
external :
true#使用外部指定网桥注意:/网桥必须存在
env_file:环境文件将environment环境中配置文件访日指定配置文件中 要以.env结尾
environment:
MYSQI_ROOT_PASSWORD=root
把上面的MYSQI_ROOT_PASSWORD=root放入mysql.env文件中
services :
服务id:
image: #使用镜像是谁image : tag image image : @digest
container_name:#服务启动之后容器名称相当docker run之后的 --name
ports: #用来指定容器与宿主机端口映射相当docker run之后的 -p
- "8080:8080"
volumes: #用来指定容器中目录与宿主机目录进行数据卷映射docker run之后-v
- /root /apps:容器内路径
- aa(自动):容器内路径注意:—旦使用卷名自动,必须通过volume进行声明
networks: #用来指定容器使用的是哪个网桥docker run --network
- ems(网桥名称自动创建)注意:—旦指定网桥必须通过network进行声明
environment: #用来给容器中某些环境进行斌值操作
- MYsQL_ROOT_PASSwORD=root
env_file:#用来给容器中某些环境进行赋值操作,将环境变量赋值转移到配置文件中
- mysql. env文件中内容必须是MrsgL_ROOT_PASSWORD=root
command: redis-server /usr/redis/conf/redis . conf
#用来糖盖容器启动默认指令
healthcheck:#心跳机制
test :[ "CMD","cur1","-f", "http : / / localhost "]
interval: 1m30s
timeout : 10s
retries : 3
sysctls :#用来修改容器内系统的参数
- net . core. somaxconn=1024
- net . ipv4 .tcp syncookies=0
ulimits:#用来修改容器内系统的最大进程数
nproc:65535
nofile:
soft : 20000
hard: 40000
depends_on: #用来指定当前服务启动依赖哪些服务,依赖的服务会在当前服务之前优先启动
- mysql注意:这个地方书号服务idl服务名
- ... .
volumes :
aa :
networks :
ems :
1.build 指令
作用:用来将指定dcokerFile打包成为对应镜像,然后再运行该镜像
services:
web:
build: #用来指定Dockerfile所在目录,先根据build中Dockerfile自动构建镜像,自动运行容器
demo :
build:#启动服务时先将build命令中指定dockerfile打包成镜像,在运行该镜像
context : demo#指定上下文目录dockerfile所在目录
dockerfile: Dockerfile
container_nane: deno
ports :
-"8082:8081"networks :
- hello
depends_on :
- tomcat01
#flask web appv1.0
#搭建一个基于flask的web项目∶实现了简单的访问量统计
#第一步︰获取一个镜像︰python3.6
#第二步∶拷贝项目代码到镜像中
COPY ./flask-web-code /code
#第三步︰安装项目的依赖环境︰第三方模块flaskredis
WORKDIR /code
RUN pip install
#第四步∶配置项目的启动CMD参数python app.py
撰写docker-compose.yaml配置文件,启动项目
docker-compose config 查看配置文件是否有误
docker-compose up 启动 -d 重启
docker-compose down
单机ELK部署:
dcoker.elastic.co
查看日志:docker-compose logs -f
设置开机运行脚本,否则在退出后不会改变:sysctl -w vm.1 count-262144
docker compose 中的指令
1. compose模板指令和指令区别
模板指令:用来书写在docker-compose.yml文件中指令称之为模板指令用来为服务进行服务的指令:用来对整个docker-compose.yml对应的这个项目操作︰书写docker-compose命令之后命令
docker-compose up(指令)
2.常用指令
1. up指令
作用:用来启动所有docker-compose服务选项:-d 后台启动所有服务
2 . down指令
作用:用来关闭所有docker-compose服务3 .exec指令
作用:进入容器
docker-compose exec redis (docker-compose. yml中声明服务id) bash
4 . ps指令
作用:用来展示当前docker-compose运行的所有容器
docker-compose ps
5 .restart指令
作用:用来重启项目中某个服务如果不写服务id 默认重启所有服务
docker-compose restart[服务di]
6. rm指令
作用:用来删除项目服务
docker-compose rm -fv[服务id]注意:谨慎操作-v删除服务的数据卷
7. start指令启动服务docker-compose start[服务id]
8. stop指令关闭服务docker-composestop[服务id]
9. top指令用来查看compose容器内运行的进程docker-compose top
10. docker-compose. unpause服务id
11.docker-compose pause服务id
12.dcoker-compose logs 服务id 查看服务日志
docker 可视化镜像:
1.下载可视化工具
docker pullportainer/portainer
2.启动portainer
docker run -d
-p 8000 :8000
-p 9000 : 9000
--name-portainer--restart=always
-v /var/run/docker . sock : /var /run/docker .sock
-vportainer_data : /data
portainer/portainer
3.通过docker-compose启动
portainer :
image: portainer/portainercontainer_name: portainer
volunes:
- lvar /run/docker .sock : /var/run/docker . sock
- portainer_data : /data
networks :
- helloports:
- "8000:8000 "
- "9000:9o00"
记得声明,在数据卷那儿
停止所有容器:docker stop $(docker ps -aq)
删除所有容器:docker rm $(docker ps -aq)
删除所有镜像:docker rmi $(docker images -q)
$ docker ps -a // 查看暂停容器
$ docker ps -a -q // 查看所有容器ID