docker 基础命令

silverwq
2024-03-14 / 0 评论 / 75 阅读 / 正在检测是否收录...

概述

docker 命令有点借鉴git命令的意思,有docker pull,docker push等。

ltqyspps.png

镜像相关

查找镜像

默认的镜像仓库都在国外:hub.docker.com,可以改成阿里云的镜像仓库,可以见安装教程文章。

通过search命令,可以搜索一些镜像信息,例如搜索redis镜像

docker search redis

ltqxciov.png

镜像拉取

拉取最新版本的镜像

# 要跟上完整的名称,默认拉取的是最新的版本
docker pull supermanito/helloworld

如下图所示,这个镜像分成了2层,所以拉取的时候看到了2个

ltqxr91o.png

关于镜像分层存储,主要是为了节省存储空间,例如:

ltqyf377.png

拉取指定版本的镜像,例如v3版本的redis

docker pull redis:3

查看本地镜像

docker images

ltqxysy9.png

删除镜像

rm 默认是删除容器,rmi表示删除镜像

docker rmi 镜像的ImageId

ltqyk899.png

有时候一个镜像id对应多个容器,这个时候删除要通过镜像仓库名称的方式删除,不然会报错,因为同一个镜像id有多个

容器

创建并且运行一个镜像

首先查找本地的nginx镜像,如果本地没有nginx镜像,则会从远程拉取。使用run命令,加上镜像名称,即可运行起来

docker run nginx

用上述这个命令直接运行的话,有几个问题:

  1. nginx 容器会前台运行
  2. 宿主机的网络和nginx容器时候隔离开的,宿主机无法访问到容器里的网络

端口映射和后台启动

为了解决上面两个问题,可以使用-d后台运行,-p将主机的端口:映射到容器的端口里,docker使用的是iptables防火墙路由映射的功能

docker run -d -p 80:80 nginx

查看端口映射信息

docker ps

ltqzhbz3.png

如果说,容器内有多个端口,想要一次性暴露出来,这些端口绑定到宿主机的随机端口上,可以用-P参数

docker run -d -P nginx

下图中的32768是随机端口。

ltr0y5rk.png

设置容器名称

因为容器id比较不好记住,操作的时候不方便,所以启动的时候,可以指定名称,这样对容器的操作比较方便

docker run -d -p 81:80 --name nginxName nginx

ltr1856i.png

然后,就可以通过名字来操作了

docker stop nginxName

容器退出时候自动删除容器

有时候,容器依赖一些配置,如果没有配置的话,就启动不起来,但是即使启动失败了,执行docker run 命令后,容器还是会创建了,这个时候产生的容器没啥用,还得手动去删除。所以这个时候可以使用--rm参数,容器退出后自动删除,对于测试的时候可以用,但是redis,mysql这种存储数据的最好不要用

ltr1kv80.png

 docker run --rm supermanito/helloworld

容器因为一些原因,关闭了,需要重启

指定容器关闭时的重启策略,有三种可选策略,通过--restart参数设置

  1. no(默认):表示不重启
  2. on-failure:当失败时重启,还可以加上3指定最多重启3次,如果3次都失败就不再重启了,这种是针对异常关闭,如果是docker stop命令,不会重启
  3. always:只要已关闭就自动重启,服务器重启后也能自动启动
# 容器关闭后,重启三次
docker run -d --name nginx01 -P --restart on-failure:3 nginx
# docker一旦启动,容器就自动起来,不然的话默认是关闭的,需要手动启动各个容器
docker run -d --name nginx01 -P --restart always nginx

设置容器里的环境变量

有时候,我们需要通过环境变量判断一些程序逻辑,这个时候在docker启动的时候,通过-e参数(也可以--env来指定)进行指定就好了

# 设置了两个环境变量,多个环境变量,需要多个-e指定
docker run -d -P --name nginx_env -e JAVA_ENV=dev -e JAVA_VM=G1 nginx

查看容器的一些基础信息,包括环境变量:

docker inspect nginx_env

ltr2lmfk.png

我们还可以通过docker exec命令,把命令发送给容器执行,-it表示让容器启动一个终端来执行命令,要执行的env命令放在最后

[root@localhost ~]# docker exec -it nginx_env env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=9689859c69d1
TERM=xterm
JAVA_ENV=dev
JAVA_VM=G1
NGINX_VERSION=1.21.5
NJS_VERSION=0.7.1
PKG_RELEASE=1~bullseye
HOME=/root

限制容器的资源限制

可以限制的内容很多,可以通过docker run --help查看run的一些参数信息

# -m 限制内存为8m,单位还可以是k,g,cpu设置为1个
docker run -d -rm -m 8m --cpus 1 nginx

那我们怎么知道,容器有没被限制呢,可以通过查看容器的实时状态查看

docker stats 容器id

ltr371c6.png

查看运行中的容器

查看正在运行中的所有容器

docker ps

查看所有状态的容器

docker ps -a

删除容器

这个容器id,可以是完整的容器id,也可以是前缀好,只要能唯一定位到容器即可

docker rm 容器id
# 一次删除多个
docker rm 74350eb761cc c7353a2bf490

强行删除进行中的容器

运行中的容器可以删除吗?正常是不要这么操作,正常要先停止容器,然后再删除就好了。如果非要删除进行中的,可以-f参数

docker rm -f 74350eb761cc

停止容器

docker stop 容器id

启动容器

docker start 容器id

查看容器日志

以下就可以输出容器的日志信息,比如nginx容器的信息,以下命令一次性输出所有

docker logs 容器id
docker logs c1bd1b7f7f9a

如果想要实时查看最近的20条,可以用-f,是flow的简写

docker logs -f -n 20 ngix01

进入容器内部

因为容器相当于一个小虚拟机,容器内和容器外,文件系统是隔离开的,可以进入容器内部

docker exec -it nginx01 /bin/bash

如果要退出的话,只需要输入exit就好。

容器内和容器外的文件隔离方式其实也很简单,就从宿主机上专门申请一块磁盘目录,用于容器的存储

ltr3uavz.png

0

评论 (0)

取消