Docker基础
Posted 转角90
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础相关的知识,希望对你有一定的参考价值。
Docker介绍
Docker是一种管理应用的现代手段,让应用管理变得可以预测和高效
Docker安装
Docker安装位置
默认位置是C:\\Program Files\\Docker
软连接
mklink /j "C:\\Program Files\\Docker" "F:\\Docker"
注意
-
是否以管理员身份打开的命令行?
-
目标路径下是否已经有 命令行里的目录,例如:命令 mklink /j "C:\\Program Files\\Docker" "D:\\Program Files\\Docker" 中,D:\\Program Files\\Docker 这个目标路径要已经存在,即这个文件夹已经存在。
-
源路径必须不存在,即:C:\\Program Files\\Docker 必须不存在,否则提示 :文件夹已存在
-
为了保证安装成功,最好把安装包,直接放在 目标文件夹里 双击运行安装。
启动
Docker使用
命令行操作
镜像操作
- docker search <镜像名>: 查询镜像
- docker image ls: 显示所有镜像
- docker image rmi <镜像名>: 删除镜像
- docker history <镜像名>:显示镜像历史
- docker inspect <镜像名>: 显示一个或多个镜像详细信息
- docker pull <镜像名>:拉取镜像
- docker push <镜像名>:推送一个镜像到镜像仓库
- docker rmi <镜像名>: 删除镜像
- docker image tag <镜像名> [用户名]/[仓库]:[tag名]: 标记本地镜像,将其归入某一仓库
- docker image prune: 移除未使用的镜像
- docker save -o [filename].tar [镜像]:将镜像保存为.tar文件
- docker load -i [filename].tar: 将.tar文件导入创建镜像
- docker build -t [镜像名] . : 构建镜像
容器操作
- docker run <镜像>
- docker container ls
- docker inspect
- docker container stats: 显示容器资源使用统计
- docker container top: 显示一个容器运行的进程
- docker container update -m 500m [容器ID]: 更新一个或多个容器配置
- docker container port <容器ID>: 端口
- docker container stop <容器ID>: 停止
- docker container start <容器ID>: 开始
- docker container rm <容器ID>: 删除
- docker container rm $(docker ps -a -q)
- docker kill <容器ID>: 终止容器(发送)
- docker logs <容器ID>: 查看容器的输出
- docker container exec -it [容器ID] 命令:进入一个正在运行的docker容器执行命令
- docker container cp [容器ID]:文件路径: 将文件拷贝到本机
- docker commit -a \'作者\' -m \'说明\' [容器ID]: 创建一个新镜像,来自一个容器
- docker export -o [filename].tar [容器ID]: 将容器导出为一个tar文件
- docker import [filename].tar: 将容器快照文件tar归档并创建镜像
参数
- -i:交互式
- -t:分配一个伪终端
- -d:运行容器到后台
- -a:指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
- -e:设置环境变量
- -p:指定端口映射,格式为:主机(宿主)端口:容器端口
- -q:只显示容器ID
- --name="nginx-lb": 为容器指定一个名称
制作Dockerfile
编写Dockerfile
命令 | 含义 |
---|---|
FROM | 继承的镜像 |
COPY | 拷贝 |
WORKDIR | 指定工作路径 |
RUN | 编译打包阶段运行的命令 |
EXPOSE | 暴露端口 |
CMD | 容器运行阶段运行命令 |
RUN 和 CMD
RUN 是
.dockerignore
表示要排除,不要打包到image中的文件
.git
node_modules
数据盘
删除容器时,一些数据需要永久保存时
位置: 宿主机
/var/lib/docker/volumes/自定义名称/_data
下
创建
docker volume create [数据盘名称]
挂载
docker volume create nginx-vol
挂载
docker run -d --name=nginx1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx2 -v nginx-vol:/usr/share/nginx/html -p 3000:80 nginx
删除
docker stop nginx1 停止容器
docker rm nginx1 删除容器
docker volume rm nginx-vol 删除数据盘
管理数据盘
docker volume ls 列出所有数据盘
docker volume ls -f dangling=true 列出所有已经孤立的数据盘
docker volume rm xxx 删除数据盘
多个容器共用一个数据盘
docker create -v /logger:/logger --name logger centos
docker run --volume-from logger --name logger1 -it centos bash
docker run --volume-from logger --name logger2 -it centos bash
网络
安装Docker时,会自动创建三个网络,bridge、none、host
使用 --network 指定容器应该连接哪些网络
bridge(桥接)
该模式下会为每一个容器分配IP,默认设置
docker run --network=bridge
docker network ls 列举所有网络
docker inspect bridge 列举网络为bridge的容器
docker run -d --name nginx1 nginx
docker run -d --name nginx2 --link nginx1 nginx # --link的作用:进入到nginx2容器中,可以通过ping nginx1测试是否连接
docker exec -it nginx2 bash
apt update
apt install -y inetutils-ping # ping
apt install -y dnsutils # nslookup
apt install -y net-tools # ifconfig
apt install -y iproute2 #ip
apt install -y curl # curl
cat /etc/hosts
ping nginx1
none
关闭了容器的网络功能,对外界完全隔离
host
容器将不会虚拟出自己的网卡,配置自己的IP,而是使用宿主机的IP和端口
自定义网络
子网络之间,相互隔离,子网络内的容器可以通信
创建多个网络,每个网络IP范围均不相同
自带一个DNS服务器,可以通过容器的名字和ID访问对应的容器
docker network create --driver bridge [自定义名]
# 创建自定义网络
docker network create --dirver bridge myweb1
docker network create --dirver bridge myweb2
# 查看
docker network inspect myweb1
# 创建容器时指定网络
docker run -d --name nginx1 --net myweb1 nginx
docker run -d --name nginx2 --net myweb1 nginx
docker run -d --name nginx3 --net myweb2 nginx
docker run -d --name nginx4 --net myweb2 nginx
#nginx1、nginx2同属于 myweb1网络 可以通信,nginx3、nginx4同属于 myweb2网络 可以通信 , 不能与nginx1、nginx2通信
# 连接到指定网络
docker run -d --name nginx5 nginx
docker network connect myweb1 nginx5
# 断开连接网络
docker network disconnect myweb1 nginx5
# 移除网络
docker network rm myweb1
docker-compose
通过一个配置文件管理多个Docker 容器
- services: 定义需要的服务,每一个服务都有自己的名字、使用的镜像,挂载的数据卷所属的网络和依赖的其他服务
- networks: 是应用的网络,在它下面可以定义使用的网络名称
- volumes: 是数据卷,可以在此定义数据卷,然后挂载到不同的服务上面使用
安装
yum -y install python-pip
pip install docker-compose
docker-compose.yml
version: \'2\' # Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
services:
nginx1:
image: nginx
networks:
- \'myweb\'
- \'default\'
ports:
- \'8081:80\'
volumes:
- "data:/data" # "/var/lib/docker/volumes/nginx_data/_data"
- \'./front:/usr/share/nginx/html\'
nginx2:
image: nginx
ports:
- "8082:80"
volumes: # 数据卷,
data:
driver: local # 本地的
networks:
myweb:
driver: \'bridge\'
build
version: "3.9"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
- context 上下文路径,可以是文件路径,也可以是到链接到 git 仓库的 url。当是相对路径时,它被解释为相对于 Compose 文件的位置。
- dockerfile 指定构建镜像的 Dockerfile 文件名
- args 构建参数,只能在构建过程中访问的环境变量
- cache_from 缓存解析镜像列表
- labels 设置构建镜像的元数据
- network 设置网络容器连接,
none
表示在构建期间禁用网络 - shm_size 设置
/dev/shm
此构建容器的分区大小 - target 多阶段构建,可以指定构建哪一层
命令
- docker-compose up -d: 后台启动所有服务
- docker-compose ps: 查看
- docker-compose start: 启动所有容器
- docker-compose stop: 停止所有容器
- docker-compose rm <容器ID>: 删除服务容器
- docker-compose logs -f : 持续跟踪日志
- docker-compose down: 删除网络及容器
node服务
目录结构
docker-compose.yml
version: \'3\'
services:
db:
image: mariadb
environment: # 环境变量
MYSQL_ROOT_PASSWORD: \'123456\'
MYSQL_DATABASE: \'nodeapp\'
MYSQL_USER: \'hyf\'
MYSQL_PASSWORD: \'123456\'
volumes:
- dbdata:/var/lib/mysql
node:
build:
context: \'./images/node\'
dockerfile: Dockerfile
depends_on:
- db
web:
image: nginx
ports:
- \'8080:80\'
volumes:
- \'./images/nginx/conf.d:/etc/nginx/conf.d\'
- \'./images/node/public:/public\'
volumes:
dbdata:
driver: local
node/Dockerfile
FROM node
COPY web /web
WORKDIR /web
RUN pnpm i
EXPORSE 80
CMD npm start
Docker 基础镜像
参考技术Abuster 现在更常见,未来 bullseye 会越来越多。 一般情况下,其它几个都不是我们的第一选择。
Alpine 是众多 Linux 发行版中的一员,和 CentOS、Ubuntu、Archlinux 之类一样,只是一个发行版的名字,号称小巧安全,有自己的包管理工具 apk 。
Alpine 非常非常小:100M vs 5M !
官方 Alpine 镜像的文档: http://gliderlabs.viewdocs.io/docker-alpine/
但是 Alpine 的小是有代价的,在不轻易间可能会给你造成麻烦!
Alpine Linux 除了插件了一些不必要的软件之外,特别重要的是,它使用了 musl libc 代替了大名鼎鼎的 glibc 。
musl libc 含有和 glibc 一样的标准功能,但是问题是 glibc 还有标准功能之外的扩展功能,由于 glibc 的历史地位和市场占有率,导致 glibc 的扩展功能实际上的使用也很广泛!有不少软件的编译、安装和运行都用到了 glibc 的扩展功能,因此这些软件在使用了 glibc 的基础颈项上就能运行,在使用了 musl libc 的 alpine 上则不行。
另外,Alpine 并没有像 Red Hat 或 Canonical 之类的大公司为其提供维护支持,软件包的数量也比这些发行版少很多(如果只看开箱即用的默认软件仓库,Alpine 只有 10000 个软件包,而 Ubuntu、Debian 和 Fedora 的软件包数量均大于 50000。)
如果实在不想折腾,可以选择一个折衷的镜像 xxx:slim。slim 镜像一般都基于 Debian 和 glibc,删除了许多非必需的软件包,优化了体积。如果构建过程中需要编译器,那么 slim 镜像不适合,除此之外大多数情况下还是可以使用 slim 作为基础镜像的。
以上是关于Docker基础的主要内容,如果未能解决你的问题,请参考以下文章