Docker 命令
用 WindTerm( https://github.com/kingToolbox/WindTerm/releases/tag/2.5.0 )连接阿里云:直接新建会话——输入IP端口——配置代理——连接——输入用户名密码就OK了。还能可视化的从云服务器下载文件到本地,好用。
进去先看 docker 有没有安装: docker version 、 docker -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
- CONTAINER ID:容器的唯一标识符,由 12 个十六进制字符组成;
- IMAGE:创建容器时使用的镜像名称,它决定了容器中运行的程序;
- COMMAND:容器启动时执行的命令,可以是镜像的默认启动命令,也可以是用户自定义的命令;
- CREATED:容器创建的时间;
- STATUS:容器的当前状态,包括正在运行、已停止、暂停等状态;
- PORTS:容器内部开放的端口号与对应的协议,以及它们映射到宿主机上的端口号;
- 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 的参数。