写点什么

云原生(三) | Docker 篇之轻松学会 Docker 命令

作者:Lansonli
  • 2022 年 7 月 12 日
  • 本文字数:4720 字

    阅读完需:约 15 分钟

云原生(三) | Docker篇之轻松学会 Docker命令

​前言

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

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


一、常见的 Docker 命令

所有 Docker 命令手册

https://docs.docker.com/engine/reference/commandline/docker/

根据正在运行的容器制作出相关的镜像:反向

根据镜像启动一个容器:正向

有了 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 命令

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

  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 守护进程启动时就已经停止了的容器


2、docker 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
复制代码


发布于: 2022 年 07 月 12 日阅读数: 68
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
云原生(三) | Docker篇之轻松学会 Docker命令_Docker_Lansonli_InfoQ写作社区