轻松学会生存技巧 -- 命令
一、常见的Docker命令
所有Docker命令手册
https://docs.docker.com/engine/reference/commandline/docker/
命令 | 作用 |
---|---|
attach | 绑定到运行中容器的标准输入,输出,以及错误流(这样似乎也能进入容器内容,但是一定小心,他们操作的就是控制台,控制台的退出命令会生效,比如redis,nginx..) |
build | 从一个Dockerfile文件构建镜像 |
commit | 把容器的改变提交创建一个新的镜像 |
cp | 容器和本地文件系统间复制文件/文件夹 |
create | 创建新容器,但并不启动(注意与dockerrun的区分)需要手动启动.startstop |
diff | 检查容器里文件系统结构的更改[A:添加文件或目录D:文件或者目录删除C:文件或者目录更改] |
events | 获取服务器的实时事件 |
exec | 在运行时的容器内运行命令 |
export | 导出容器的文件系统为一个tar文件。commit是直接提交成镜像,export是导出成文件方便传输 |
history | 显示镜像的历史 |
images | 列出所有镜像 |
import | 导入tar的内容创建一个镜像,再导入进来的镜像直接启动不了容器./docker-entrypoint.sh nginx-g 'daemon off;docker ps-no-trunc看下之前的完整启动命令再用他 |
info | 显示系统信息 |
inspect | 获取docker对象的底层信息 |
kill | 杀死一个或者多个容器 |
load | 从tar文件加载镜像 |
login | 登录Docker registry |
logout | 退出Docker registry |
logs | 获取容器日志;容器以前在前台控制台能输出的所有内容,都可以看到 |
pause | 暂停一个或者多个容器 |
port | 列出容器的端口映射 |
ps | 列出所有容器 |
pull | 从registry下载一个image 或者repository |
push | 给registry推送一个image或者repository |
rename | 重命名一个容器 |
restart | 重启一个或者多个容器 |
rm | 移除一个或者多个容器 |
rmi | 移除一个或者多个镜像 |
run | 创建并启动容器 |
save | 把一个或者多个镜像保存为tar文件 |
search | 去docker hub寻找镜像 |
start | 启动一个或者多个容器 |
stats | 显示容器资源的实时使用状态 |
stop | 停止一个或者多个容器 |
tag | 给源镜像创建一个新的标签,变成新的镜像 |
top | 显示正在运行容器的进程 |
unpause | pause的反操作 |
update | 更新一个或者多个docker容器配置 |
version | Show the Docker version information |
container | 管理容器 |
image | 管理镜像 |
network | 管理网络 |
volume | 管理卷 |
根据正在运行的容器制作出相关的镜像:反向
根据镜像启动一个容器:正向
有了Docker:
- 先去软件市场搜镜像:https://registry.hub.docker.com/ docker hub
- 下载镜像 docker pull xxx
- 启动软件 docker run 镜像名;
对于镜像的所有管理操作都在这一个命令:docker image --help
代码语言:javascript复制docker pull redis == docker pull redis:latest(最新版)
阿里云的镜像是从docker hub来的,我们配置了加速,默认是从阿里云(缓存)下载
REPOSITORY(名) TAG (标签) IMAGE ID(镜像id) CREATED(镜像的创建时间) SIZE
redis 5.0.12-alpine3.13 50ae27fed589 6 days ago 29.3MB
redis latest 621ceef7494a 2 months ago 104MB
镜像是怎么做成的。基础环境 软件
redis的完整镜像应该是: linux系统 redis软件
alpine:超级经典版的linux 5mb; redis = 29.0mb
没有alpine3的:就是centos基本版
以后自己选择下载镜像的时候尽量使用
代码语言:javascript复制alpine: slim:
docker rmi -f $(docker images -aq) #删除全部镜像
docker image prune #移除游离镜像 dangling:游离镜像(没有镜像名字的)
docker tag 原镜像:标签 新镜像名:标签 #重命名
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create [设置项] 镜像名 [启动] [启动参数...]
docker create redis: 按照redis:latest镜像启动一个容器
docker kill是强制kill -9(直接拔电源);
docker stop #可以允许优雅停机(当前正在运行中的程序处理完所有事情后再停止)
docker create --name myredis -p 6379(主机的端口):6379(容器的端口) redis -p port1:port2 #port1是必须唯一的,那个是没关系的。
docker run --name myredis2 -p 6379:6379 -p 8888:6379 redis :默认是前台启动的,一般加上-d 让他后台悄悄启动, 虚拟机的很多端口绑定容器的一个端口是允许的
docker run -d == docker create docker start
启动了nginx;一个容器。docker 容器里面安装了nginx,要对nginx的所有修改都要进容器:
代码语言:javascript复制docker attach 绑定的是控制台. 可能导致容器停止。不要用这个
docker exec -it -u 0:0 --privileged mynginx4 /bin/bash: 0用户,以特权方式进入容器
docker container inspect 容器名 = docker inspect 容器
docker inspect image /network/volume ....
一般运行中的容器会常年修改,我们要使用最终的新镜像
代码语言:javascript复制docker commit -a lansonli -m "first commit" mynginx4 mynginx:v4
把新的镜像放到远程docker hub,方便后来在其他机器下载
代码语言:javascript复制---------export操作容器/import-------------------
docker export导出的文件被import导入以后变成镜像,并不能直接启动容器,需要知道之前的启动命令 (docker ps --no-trunc),然后再用下面启动。
docker run -d -P mynginx:v6 /docker-entrypoint.sh nginx -g 'daemon off;
' 或者docker image inspect 看之前的镜像,把 之前镜像的 Entrypoint的所有和 Cmd的连接起来就 能得到启动命令
----save/load--操作镜像--
docker save -o busybox.tar busybox:latest 把busybox镜像保存成tar文件
docker load -i busybox.tar 把压缩包里面的内容直接导成镜像
----------
镜像为什么能长久运行
镜像启动一定得有一个阻塞的进程,一直干活,在这里代理。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run --name myredis2 -p 6379:6379 -p 8888:6379 redis
镜像启动以后做镜像里面默认规定的活。
docker run -it busybox; 交互模式进入当前镜像启动的容器
---------
----产生镜像-----
1、基于已经存在的容器,提取成镜像 2、人家给了我tar包,导入成镜像 3、做出镜像
-1)、准备一个文件Dockerfile
FROM busybox
CMD ping baidu.com
-2)、编写Dockerfile
-3)、构建镜像
docker build -t mybusy66:v6 -f Dockerfile .
---做redis的镜像---
FROM alpine(基础镜像)
//下载安装包
//解压
//准备配置文件
CMD redis-server redis.conf
----------
build 是根据一个Dockerfile构建出镜像
commit 是正在运行中的容器提交成一个镜像
容器的状态
- Created(新建)、Up(运行中)、Pause(暂停)、Exited(退出)
docker run的立即启动,docker create得稍后自己启动
推送镜像
- 注册docker hub并登录
- 可以创建一个仓库,选为public
- docker push lansonli/mynginx:tagname
- docker hub一个完整镜像的全路径是
- docker.io/library/redis:alpine3.13 我们的 docker.io/lansonli/mynginx:tagname
- docker images的时候镜像缩略了全名 默认官方镜像没有docker.io/library/
- docker.io/ rediscommander / redis-commander:latest
- docker.io/lansonli/mynginx:v4 我的镜像的全称
- 登录远程docker仓库
- 当前会话登录以后 docker login 。所有的东西都会push到这个人的仓库
- docker push lansonli/mynginx:tagname
- 上面命令的完整版 docker push docker.io/lansonli/mynginx:v4
- 怎么知道是否登录了 cat ~/.docker/config.json 有没有 auth的值,没有就是没有登录
docker hub太慢了,用阿里云的镜像仓库,或者以后的habor仓库
代码语言:javascript复制sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lsl/mynginx: 镜像版
sudo docker push registry.cn-hangzhou.aliyuncs.com/lsl/mynginx:[镜像版本号]
仓库网址/名称空间(lsl/lansonli)/仓库名:版本号
二、经典的Docker命令
1、docker run
常用关键参数 OPTIONS 说明:
- -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: 绑定一个卷。一般格式 主机文件或文件夹:虚拟机文件或文件夹
1)如何使用Docker部署组件
- 先去找组件的镜像
- 查看镜像文档,了解组件的可配置内容
- docker run进行部署
2)常见部署案例
1、部署Nginx
代码语言:javascript复制# 注意 外部的/nginx/conf下面的内容必须存在,否则挂载会覆盖
docker run --name nginx-app
-v /app/nginx/html:/usr/share/nginx/html:ro
-v /app/nginx/conf:/etc/nginx
-d nginx
2、部署MySQL
代码语言:javascript复制# 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
3、部署Redis
代码语言:javascript复制# 提前准备好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
4、部署ElasticSearch
代码语言:javascript复制#准备文件和文件夹,并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
5、部署Tomcat
代码语言:javascript复制# 考虑,如果我们每次 -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
6、重启策略
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
2、docker exec
在运行的容器中执行命令
语法
代码语言:javascript复制docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
- -d :分离模式: 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
docker exec -it alpine sh
3、docker build
命令用于使用 Dockerfile 创建镜像。
语法
代码语言:javascript复制docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
- --build-arg=[] :设置镜像创建时的变量;
- --cpu-shares :设置 cpu 使用权重;
- --cpu-period :限制 CPU CFS周期;
- --cpu-quota :限制 CPU CFS配额;
- --cpuset-cpus :指定使用的CPU id;
- --cpuset-mems :指定使用的内存 id;
- --disable-content-trust :忽略校验,默认开启;
- -f :指定要使用的Dockerfile路径;
- --force-rm :设置镜像过程中删除中间容器;
- --isolation :使用容器隔离技术;
- --label=[] :设置镜像使用的元数据;
- -m :设置内存最大值;
- --memory-swap :设置Swap的最大值为内存 swap,"-1"表示不限swap;
- --no-cache :创建镜像的过程不使用缓存;
- --pull :尝试去更新镜像的新版本;
- --quiet, -q :安静模式,成功后只输出镜像 ID;
- --rm :设置镜像成功后删除中间容器;
- --shm-size :设置/dev/shm的大小,默认值是64M;
- --ulimit :Ulimit配置。
- --squash :将 Dockerfile 中所有的操作压缩为一层。
- --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- --network: 默认 default。在构建期间设置RUN指令的网络模式
docker build -t imageName -f DockerfileName .
4、docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
语法
代码语言:javascript复制docker push [OPTIONS] NAME[:TAG]
OPTIONS说明:
- --disable-content-trust :忽略镜像的校验,默认开启
docker push myapache:v1