1.docker安装
1.安装docker
2.配置docker加速器
3.docker的基本目录
/etc/docker/ docker的认证目录
/var/lib/docker/ docker的应用目录
2.docker容器
docker image pull nginx
docker container stop nginx
docker container rm $(docker container ps -aq) #q: --quiet Only display container IDs
docker system prune -a -f
docker container run -p 80:80 nginx
docker container run -d -p 80:80 nginx
# 创建一个容器并进入交互式模式
docker container run -it nginx sh # i :-interactive
#在一个已经运行的容器里执行一个额外的command
docker container exec -it 容器id sh
#安装pstree
pip install psmisc
ps -aef --forest
pstree -halps 7718
docker container 命令 #默认省略container
docker ps
docker run -d nginx
docker start 容器id
docker stop 容器id
#删除某个容器id
docker rm 容器id
#取出所有停止的容器
docker container prune
#强制删除正在容器
docker rm -f 容器id
#删除部分容器
docker container prune --filter 'until=24h'
#批量删除
docker rm -f ${docker ps -a -q}
#创建容器并进入容器
docker run --name 容器名称 -it 镜像名称 /bin/bash
#进入容器
docker exec -it 容器id /bin/bash
#基于容器创建镜像
docker commit -m '改动信息' -a '作者' 容器id 镜像名称:标签名称
#查看日志
dockerlogs 容器id
#查看容器信息
docker inspect 容器id
#查看容器的网络信息
docker inspect --format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器id
操作 | 命令(全) | 命令(简) |
---|---|---|
容器的创建 | docker container run | docker run |
容器的列出(up) | docker container ls | docker ps |
容器的列出(up和exit) | docker container ls -a | docker ps -a |
容器的停止 | docker container stop | docker stop |
容器的删除 | docker container rm | docker rm |
3.docker镜像
#搜索镜像
docker search unbuntu
#拉取镜像
docker pull unbuntu
#列举出所有镜像,-a包括删除的
docker images -a
#查看镜像历史命令格式
docker history 镜像名称
#镜像重命名
docker tag [old_iamge]:[old_version] [new_image]:[new_version]
#删除镜像
docker rmi 镜像id
#清除状态为dangling的镜像
docker image prue
#移除所有未被使用的镜像
docker image prune -a
#移除所有未被使用的镜像
docker image prue -a --filter 'until=24h'
#镜像导出
docker save -o nginx.tar 镜像名称
#导入镜像
docker load < 镜像包名称
4.dockerfile
1.每一行的RUN命令都会产生一层image layer, 导致镜像的臃肿
2.ADD和COPY目标目录不存在都会自动创建 ,ADD自动去解压缩文件
3.ENV设置的变量可以保存在image中和容器中
4.ARG 可以在镜像build的时候动态修改value, 通过 --build-arg
5.容器启动命令 CMD,容器启动时默认执行的命令, 启动容器时指定了其它命令,则CMD命令会被忽略
6.entrypoint用于设置执行的命令,cmd传递参数
7.建议使用exec的列表格式可以使用env环境变量
8.尽量使用非root用户
docker build -t 镜像名称:版本号 -f dockerfile文件名 所在目录
docker build -t mycorn:v1 -f Dockerfile_corn .
5.docker的存储
data volume
#创建数据卷
docker run -itd --name 容器名称 -v 宿主机目录:容器目录 镜像名称
docker volume rm
docker volume prue
#创建一个数据卷容器
docker create -v 容器目录 --name 容器名称 镜像名称
#创建两个容器,同时挂载数据卷容器
docker run --volumes-form 数据卷容器id/name -tid --name 容器名称 镜像名称
bind mount
6.docker网络
docker 容器的网络有四种模式:
网络模式 | 简介 |
---|---|
Bridge(默 认模式) | 此模式会为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网 桥,通过 docker0 网桥以及 Iptables nat 表配置与宿主机通信。 |
Host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的 IP 和端口 |
Container 创建的 | 创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP,端口范围。 |
None | 该模式关闭了容器的网络功能,与宿主机、与其他容器都不连通的. |
# -P(大写) 随机端口映射
自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1
docker run -d -P 镜像名称
# -p(宿主机端口:容器端口) 指定映射
# docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
docker run -d -p 19.168.8.14:80 --name nginx-2 nginx
#查看宿主机端口
netstat -tunlp | grep docker-proxy
#traceroute命令
tracepath www.baidu.com
#curl命令
#查看容器间的网络
docker network ls
#用户自定义网桥
docker network create 网桥名称
#将容器连接到用户定义的网桥中
docker network connect 网桥名称 容器名称
#查看具体网络信息
docker network inspect bridge
#筛选出容器的ip
docker inspect --format='{{.NetworkSettings.IPAdrress}}' nginx_bridge
#安装brctl
yum install -y bridge-utils
#查看bridge信息
brctl show
#添加网络命名空间
ip netns add 空间名
ip link add veth-ns1 type veth peer name eth00-ns1
ip link set eth00-ns1 netns ns1
ip netns exec ns1 ip addr add 172.16.1.1/16 dev eth00-ns1
ip netns exec ns1 ip link set eth00-ns1 up
#把veth-ns1这个bridge up起来
ip link set veth-ns1 up
brctl addif mydocker0 veth-ns1
#创建网桥
brctl addr mydocker0
#查看路由
ip route
#查看iptable转发规则
iptables --list -t nat
#查看iptables的端口转发规则
iptables -t nat -nvxl
网络知识补充NAT
7.docker compose
1.安装
pip install docker-compose
2.compose文件的结构和版本
veseion: "3.8"
services: '容器'
servicename1: '服务器名称'
image: '镜像名称'
command: '可选,默认覆盖镜像里的CMD命令'
environment: '可选,相当于docker run 里的-env'
volumes: '可选,相当于 docker run 里的 -v'
networks: '可选,相当于 docker run 里 --network'
ports: '#可选,相当于 docker run里的-p'
servicename2:
build:
context: '指定Dockerfile文件所在的目录'
docekerfile: 'Dockerfile文件名'
args:
参数名: 参数值
container_name: '默认将会使用 项目名称_服务名称_序号 这样的格式,注意::指定容器名称后,该服务将无法进行扩展(scale),因为Docker不允许多个容器具有相同的名称'
depends_on:
- servicename1
env_file: .env
environment:
RACK_ENV: development
expose:
- "3000"
- "8000"
network_mode: "bridge"
networks:
some-network:
ipam :
drive: default
config:
- sububet "'172.16.0.0.1/16'"
other-network:
ports:
- "3000"
volumes:
- /var/lib/mysql
restart: always
security_opt:
- seccomp:unconfined #指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)
logging: #日志选项
driver: "json-file"
options:
max-size: "500m"
volumes: '可选 相当于docker volumes create'
networks: '可选 相当于 docker network create'
3.docker-compose基本命令
docker-compose -f docker-compose.yml -p project
docker-compose build 服务名称
docker-compose config #检查docker-compose.yml文件格式是否正确
docker-compose down
docker-compose up
docker-compose images #查看compose中包含的镜像
docker-compose pull #拉取服务所依赖的镜像
docker-compose restart #重启项目中的服务
docker-compose run 容器名称 ping 服务名称 #在指定服务器启动一个容器,并执行ping docker.com
docker-compose run -d --name 名称 -e key=val -u user名
docker-compose scale 容器1=3 容器2=2 #容器1启动3个,容器2启动2个
docker-compose start 服务名称
docker-compose stop
docker-compose run
docker-compose up
4.容器的健康检查
dockerfile
HEALCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:5000 || exit 1
compose.yaml
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
ping box1
dig box1
--remove-orphans
ro:表示只读
--env-file
8. git和容器–cicd
azure和github action很像
M9OHH-Q88JQ-DX72D-R04RN
dckr_pat_9uHXTMgCFExvaYr3F7ujE6x_9nQ