Docker 命令

发布时间 2023-04-17 17:04:26作者: 風栖祈鸢

Docker 命令

用 WindTerm( https://github.com/kingToolbox/WindTerm/releases/tag/2.5.0 )连接阿里云:直接新建会话——输入IP端口——配置代理——连接——输入用户名密码就OK了。还能可视化的从云服务器下载文件到本地,好用。

进去先看 docker 有没有安装: docker versiondocker -v:查看当前 docker版本。

查看容器状态

docker ps :列出所有运行中的容器;

docker ps -a :列出所有容器;

docker ps --format "{{.ID}}\t{{.Image}}\t{{.Command}}" :指定列出的格式,如此处只想看 ID、IMAGE、COMMAND;

docker ps 执行后显示如下:

CONTAINER ID        IMAGE                                         COMMAND                  CREATED             STATUS              PORTS                                             NAMES
b753dc8d9876        wuweis/jdk:1.8.alpine                         "/bin/sh -c '/usr/lo…"   23 months ago       Up 20 months        0.0.0.0:8031->8080/tcp, 0.0.0.0:32794->9999/tcp   jlr-cons-tianjin
  1. CONTAINER ID:容器的唯一标识符,由 12 个十六进制字符组成;
  2. IMAGE:创建容器时使用的镜像名称,它决定了容器中运行的程序;
  3. COMMAND:容器启动时执行的命令,可以是镜像的默认启动命令,也可以是用户自定义的命令;
  4. CREATED:容器创建的时间;
  5. STATUS:容器的当前状态,包括正在运行、已停止、暂停等状态;
  6. PORTS:容器内部开放的端口号与对应的协议,以及它们映射到宿主机上的端口号;
  7. NAMES:为容器指定的名称,可以是自定义名称,也可以是自动生成的名称。

镜像构建/容器启动

镜像可以看作是容器的模板,容器是镜像的一个运行实例。不同容器可以基于相同的镜像构建(如上面的 jdk:1.8.alpine ),它们运行的应用程序和服务也可以不同。

假设我们有一个使用 Spring Boot 框架编写的 Web 应用程序,该应用程序需要在8080端口监听 HTTP 请求。为了将这个应用程序打包到 Docker 镜像中,可以使用 Dockerfile 定义构建过程:

FROM wuweis/jdk:1.8.alpine
COPY myapp.jar /app/myapp.jar
EXPOSE 8080
CMD ["java", "-jar", "/app/myapp.jar"]

这个Dockerfile中首先使用 FROM指令指定了基础镜像,然后使用 COPY指令将 myapp.jar文件复制到镜像中的 /app目录中,使用 EXPOSE指令声明应用程序将监听的端口是8080,最后使用 CMD指令指定容器启动时要执行的命令,即使用Java运行 myapp.jar文件。

在构建不同的服务时,将不同的应用程序文件(例如不同的 jar 包)COPY 到镜像中,然后启动这些镜像,就可以启动不同的服务。

docker run -d -p 8081:8080 --name=myapp1 myimage
docker run -d -p 8082:8080 --name=myapp2 myimage
docker run -d -p 8083:8080 --name=myapp3 myimage

这些容器都是基于同一个镜像(myimage)创建的,但是它们运行的应用程序和服务可以是不同的,取决于构建镜像的时候往里面放了什么应用程序、启动的命令等。这些容器之间是相互独立的,它们可以有自己的配置文件、日志文件、数据文件等等。

进入容器复制文件

首先进入某个容器:

docker exec -it <container-id> sh :进入容器,需要指定容器 ID。

进入容器就是普通的 Linux Shell 界面,可以查看需要的文件在哪里;

然后退出容器回到 docker 主机:

exit :在容器中的 shell 直接输出退出当前容器,回到主机。

然后执行复制文件的命令:

docker cp <container-id>:/path/yourfileaddress /path/copyfileto :将某文件复制到另一个路径。

查看服务日志

docker logs <container-id-or-name> :打印某个服务的日志,会全部打印,不要直接用哦。

如果服务使用了日志框架(如 Log4j ),那么可以设置日志级别来筛选输出,如:

docker logs --tail=100 -f --since=2021-01-01 --until=2021-12-31 myapp1 | grep "DEBUG"

这个命令将会输出名为 myapp1 的容器的最后100行日志,并过滤出 DEBUG 级别的日志。同时,使用 --since--until 参数可以设置输出日志的时间范围,使用 -f 参数可以将日志实时输出。

查看容器启动命令

首先通过 docker ps 列出运行的容器,找到要查看的容器的 ID 或 NAME,使用如下命令:

docker inspect <container-id-or-name>

该命令将返回一个 JSON 格式的对象,其中包含容器的所有信息。可以从中找到需要的信息,例如容器的 IP 地址、端口映射等等。

如我找到了我需要的容器启动命令:

[
    {
        ...
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "/usr/local/start/ServerStart.sh run"
        ],
	...
    }
]

可知容器启动时的 COMMAND 为:

/bin/sh -c /usr/local/start/ServerStart.sh run

这个命令的含义为:

  • 使用 /bin/sh 作为命令的解释器;
  • -c 表示执行接下来的命令,后面紧跟要执行的命令;
  • 执行 /usr/local/start/ServerStart.sh 这个命令,即运行一个名为 ServerStart.sh 的脚本;
  • run 为前面命令的参数,但脚本中好像没有用到,只是个标记?

执行的脚本 .sh 文件:

cd /usr/local/java

java -Dio.netty.leakDetectionLevel=advanced -server -XX:+PrintGCDetails -Xloggc:/usr/local/logs/gc.log -XX:+PrintGCTimeStamps 
-Dons.client.logRoot=/usr/local/logs -Dons.client.logLevel=WARN 
-Dons.client.logFileMaxIndex=20   -Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m -jar *.jar

首先进入一个路径,然后使用通配符启动了其中的 jar 文件,可知里面应该是只有一个 jar,对应之前的不同服务使用同一镜像创建,但放进镜像里的 jar 包不同。其他的参数就是 Netty 和 JVM 的参数。