> 文档中心 > 【云原生 | Docker篇】《带你走进Docker的世界》轻松学会生存技巧 -> 命令(二)

【云原生 | Docker篇】《带你走进Docker的世界》轻松学会生存技巧 -> 命令(二)

目录

前言

一、常见的Docker命令

二、经典的Docker命令

1、docker run

1)如何使用Docker部署组件

2)常见部署案例

2、docker exec

3、docker build

4、docker push


前言

一文精讲一个知识点,多了你记不住,一句废话都没有

经典语录:世入慌慌张张,不过碎银几两。可就是这碎银几两,能解世间慌张

一、常见的Docker命令

所有Docker命令手册 https://docs.docker.com/engine/reference/commandline/docker/https://docs.docker.com/engine/reference/commandline/docker/

命令 作用
attach 绑定到运行中容器的标准输入,输出,以及错误流(这样似乎也能进入容器内容,但是一定小心,他们操作的就是控制台,控制台的退出命令会生效,比如redis,nginx..)
build 从一个Dockerfile文件构建镜像
commit 把容器的改变提交创建一个新的镜像
cp 容器和本地文件系统间复制文件/文件夹
create 创建新容器,但并不启动(注意与dockerrun的区分)需要手动启动.start\stop
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

  1. 先去软件市场搜镜像:https://registry.hub.docker.com/ docker hub
  2. 下载镜像 docker pull xxx
  3. 启动软件 docker run 镜像名;

对于镜像的所有管理操作都在这一个命令: docker image --help

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 基本版 以后自己选择下载镜像的时候尽量使用

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 的所有修改都要进容器:

docker attach 绑定的是控制台. 可能导致容器停止。不要用这个 docker exec -it -u 0:0 --privileged mynginx4 /bin/bash: 0用户,以特权方式进入容器 docker container inspect 容器名 = docker inspect 容器 docker inspect image /network/volume ....

一般运行中的容器会常年修改,我们要使用最终的新镜像

docker commit -a lansonli -m "first commit" mynginx4 mynginx:v4

把新的镜像放到远程docker hub,方便后来在其他机器下载

---------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 busyboxCMD 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 仓库

sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lsl/mynginx: 镜像版sudo docker push registry.cn-hangzhou.aliyuncs.com/lsl/mynginx:[镜像版本号]仓库网址/名称空间(lsl/lansonli)/仓库名:版本号

二、经典的Docker命令

1docker 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部署组件

  1. 先去找组件的镜像
  2. 查看镜像文档,了解组件的可配置内容
  3. docker run进行部署

2)常见部署案例

1 、部署 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

2、部署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

3 、部署 Redis

# 提前准备好redis.conf文件,创建好相应的文件夹。如:port 6379appendonly yes#更多配置参照 https://raw.githubusercontent.com/redis/redis/6.0/redis.confdocker 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

#准备文件和文件夹,并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

# 考虑,如果我们每次 -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 守护进程启动时就已经停止了的容器

2docker exec

在运行的容器中执行命令

语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d :分离模式: 在后台运行

  • -i :即使没有附加也保持STDIN 打开

  • -t :分配一个伪终端

docker exec -it alpine sh

3、docker build

命令用于使用 Dockerfile 创建镜像。

语法

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

将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

语法

docker push [OPTIONS] NAME[:TAG]

OPTIONS说明:

  • --disable-content-trust :忽略镜像的校验,默认开启

docker push myapache:v1

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢大数据系列文章会每天更新,停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨