1. 常用命令列表及查看命令帮助
- 命令列表
attach | 绑定并进入运行中容器的控制台(推出时可能会导致控制台退出) |
build | 使用DockerFile构建镜像 |
commit | 提交容器变更为一个新的镜像 |
cp | 容器内部和本地文件系统间复制文件/文件夹 |
create | 使用镜像创建容器但不启动 |
diff | 检查容器里文件系统结构的更改【A:新增 D:删除 C:更改】 |
events | 获取事件 |
exec | 进入运行时的容器 |
export | 将容器导出为tar文件,方便传输 |
history | 查看景象历史 |
images | 列出所有镜像, 同 image ls |
import | 将export导出的tar文件导入为一个镜像,导入的镜像不能直接启动,需要使用export导出容器的启动参数启动 docker ps --no-trunc 看下之前的完整启动命令再用他 /docker-entrypoint.sh nginx -g 'daemon ow ;' |
info | 显示系统信息 |
inspect | 获取daocker镜像、容器、卷等的详细信息 |
kill | 杀死一个或者多个容器 |
load | 从 tar 文件加载镜像 |
login | Docker登录 |
logout | Docker登出 |
logs | 获取容器控制台日志 |
pause | 暂停一个或者多个容器 |
port | 列出容器的端口映射 |
ps | 列出所有容器 |
pull | 镜像仓库拉取景象 |
push | 推送镜像到镜像仓库 |
rename | 重命名一个容器 |
restart | 重启一个或者多个容器 |
rm | 移除一个或者多个容器 |
rmi | 移除一个或者多个镜像 |
run | 创建并启动容器 |
save | 把一个或者多个镜像保存为tar文件 |
search | 去docker hub寻找镜像 |
start | 启动一个或者多个容器 |
stats | 显示容器资源的实时使用状态 |
stop | 停止一个或者多个容器 |
tag | 给源镜像创建一个新的标签,变成新的镜像 |
top | 显示正在运行容器的进程 |
unpause | pause的反操作 |
update | 更新一个或者多个docker容器配置 |
version | 打印docker版本 |
container | 更新一个或者多个docker容器配置 |
image | 镜像操作 |
network | 网络操作 |
volume | 存储卷管理 |
- 查看命令帮助
docker <命令> --help
2. 镜像操作
- 搜索镜像
#查看有哪些和nginx相关的镜像仓库
docker search nginx
https://hub.docker.com/ 中搜索镜像仓库:
- 镜像常规操作
拉取镜像
#拉取镜像,不带冒号后tag,默认拉取lastest
docker pull nginx:latest
查看本地镜像
#查看本地镜像
docker images
#也可使用
docker image ls
#查看镜像详细信息
docker image inspect mynginx:v1
#查看镜像历史
docker history mynginx:v1
镜像打tag
#为本地镜像打tag,打出新的镜像
docker tag nginx mynginx:v1
镜像save/load
#保存镜像到文件 -o指定保存的文件名
docker save -o mynginx.tar mynginx:v1
#从save保存的镜像文件加载成镜像 -i 指定要load的文件
docker load -i mynginx.tar
镜像删除
#删除本地游离镜像(无名镜像,多次commit会产生无名镜像)
docker image prune
#删除镜像 -f强制删除
docker image rm mynginx:v1
#也可以使用rmi
docker rmi -f mynginx:v2
#删除所有镜像 -f强制删除
docker rmi -f $(docker images -aq)
镜像import
#从容器export的文件导入镜像,0c64273374c3为容器ID
#docker export导出的文件被import导入以后变成镜像,并不能直接启动容器,需要知道之前的启动命令
#(docker ps --no-trunc),
#然后再用下面启动。 docker run -d -P mynginx:v6 /docker-#entrypoint.sh nginx -g 'daemon off;'
docker import mynginx_export.tar mng2:v1
镜像推送到远程仓库(这里也可以使用阿里云的镜像仓库)
#1 创建docker hub账户并登录
#2 创建一个镜像仓库
#3 docker login登录 通过 cat ~/.docker/config.json 查看是否登录
docker login -u <username> -p <password>
#4 打镜像tag 这里37739825/mynginx:v1为 仓库地址:tag
docker tag nginx 37739825/mynginx:v1
#5 推送镜像
docker push 37739825/mynginx
#6 docker logout退出登录
docker logout
构建镜像(这里先使用简单的dockerFile,在dockerFile编写章节详细说明)
1. 创建dockerFile
# 创建dockerFile
vi dockerFile
#在dockerFile中粘贴以下内容
FROM busybox
CMD ping baidu.com
2. 执行build指令 -t:指定镜像名:tag -f:指定dockerFile,最后.表示使用当前路径为上下文路径
# docker build构建镜像
docker build -t myimg:v1 -f dockerFile .
2. 容器操作
容器创建与启动
#create创建容器 -P分配随机端口
docker create --name mynginx2 -P nginx
#启动创建的容器 start为后台启动
docker start mynginx2
#run创建容器并启动 -d后台启动
docker run --name mynginx4 -P -d nginx
docker run可选参数详解:
-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=[]: 开放一个端口或一组端口;
--restart , 指定重启策略,可以写--restart=awlays 总是故障重启--volume , -v: 绑定一个卷。一般格式 主机文件或文件夹:虚拟机文件或文件夹
查看容器
#查看容器 -a查看全部容器
docker ps -a
#查看配置项详情
docker inspect mynginx4
进入容器
#以控制台绑定方式进入容器,这种绑定在控制台退出时可能导致容器退出
docker attach mynginx2
#进入容器 以交互方式进入容器
docker exec -it mynginx2 /bin/bash
#特权方式进入
docker exec -it -u 0:0 --privileged mynginx2 /bin/bash
容器到镜像/文件
#提交容器变更生成新的镜像 -a指定作者 -m提交信息
docker commit -a beck -m "first commit" mynginx2 mynginx:v2
#导出容器为文件 -o指定要导出的文件 导出的文件使用docker import导入
docker export -o mynginx2.tar mynginx2
docker import mynginx2.tar mng2:v1
宿主机与容器间文件/文件夹复制
#docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- :把容器里面的复制出来
docker cp mynginx4:/etc/nginx/nginx.conf nginx.conf
#docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH:把外部的复制进去
docker cp index.html mynginx4:/usr/share/nginx/html
3.卷(volume)
-v参数卷挂载/文件夹绑定
# 匿名卷挂载 自动创建volume
#docker将创建出匿名卷,并保存容器/etc/nginx下面的内容
docker run -dP -v :/etc/nginx nginx
#具名卷挂载
#docker将创建出名为nginx的卷,并保存容器/etc/nginx下面的内容
docker run -dP -v nginx:/etc/nginx nginx
#文件夹绑定
#以/开头的路径为容器宿主机绝对路径,不会自动保存容器/etc/nginx下面的内容,需要避免配置空绑定
docker run -dP -v /my/nginx:/etc/nginx nginx
volume常用命令
#创建名称为a的卷
docker volume create a
#查看a卷的详情
docker volume inspect a
#列出所有卷
docker volume ls
#移除无用卷
docker volume prune
4. 网路(network)
--link使用
# --link name:alias ,name连接容器的名称,alias连接的别名
# 启动mysql101
docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 启动mysql可以链接到mysql101
docker run -d --link mysql01:mysql --name tomcat tomcat:7
#验证网络
docker exec -it tomcat bash
cat /etc/hosts
ping mysq
网络模式
网络模式 | 配置 | 说明 |
none模式 | --net=none | 不配置网络,用户可以稍后进入容器,自行配置 |
bridge模式 | --net=bridge | 默认值,在Docker网桥docker0上为容器创建新的网络 栈 |
container模 式 | --net=container:name/id | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace |
host模式 | --net=host | 容器和宿主机共享Network namespace |
用户自定义 | --net=自定义网络 | 用户自己使用network相关命令定义网络,创建容器的时候可以指定为自己定义的网络(推荐使用) |
网络常用命令
#创建名为mynet的网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#查看网络列表
docker network ls
#查看网络详情
docker network inspect host
#将容器连接到自定义网络
docker network connect mynet tomcat
5. docker部署常用组件
nginx
# 注意 外部的/nginx/conf下面的内容必须存在,否则挂载会覆盖
docker run --name nginx-app \
-v /app/nginx/html:/usr/share/nginx/html:ro \
-v /app/nginx/conf:/etc/nginx
-d nginx
mysql
# 5.7版本 docker run -p 3306:3306 --name mysql57-app \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
#8.x版本,引入了 secure-file-priv 机制,磁盘挂载将没有权限读写data数据,所以需要将权限透传, 或者chmod -R 777 /app/mysql/data
# --privileged 特权容器,容器内使用真正的root用户 docker run -p 3306:3306 --name mysql8-app \
-v /app/mysql/conf:/etc/mysql/conf.d \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged \
-d mysql
redis
# 提前准备好redis.conf文件,创建好相应的文件夹。如:
port 6379
appendonly yes
#更多配置参照 https://raw.githubusercontent.com/redis/redis/6.0/redis.conf
docker run -p 6379:6379 --name redis \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.2.1-alpine3.13 \
redis-server /etc/redis/redis.conf --appendonly yes
ElasticSearch
#准备文件和文件夹,并chmod -R 777 xxx #配置文件内容,参照 https://www.elastic.co/guide/en/elasticsearch/reference/7.5/node.name.html 搜索相 关配置 # 考虑为什么挂载使用esconfig ... docker run --name=elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
-v /app/es/data:/usr/share/elasticsearch/data \
-v /app/es/plugins:/usr/shrae/elasticsearch/plugins \
-v esconfig:/usr/share/elasticsearch/config \
-d elasticsearch:7.12.0
Tomcat
# 考虑,如果我们每次 -v 都是指定磁盘路径,是不是很麻烦? docker run --name tomcat-app -p 8080:8080 \
-v tomcatconf:/usr/local/tomcat/conf \
-v tomcatwebapp:/usr/local/tomcat/webapps \
-d tomcat:jdk8-openjdk-slim-buster