飞天使-docker简单命令操作

进入容器

docker pull nginx
docker run --name nginx-test -p 8888:80 -d nginx

docker exec -it nginx-test bash 

查看实时日志

docker logs -f nginx-test

宿主机和容器之间文件交互

宿主机 -> 容器
单个文件
docker cp ./hello nginx-test:/etc/nginx/
整个目录
docker cp ./ztl/ nginx-test:/etc/nginx/

容器 -> 宿主机
单个文件
docker cp nginx-test:/etc/nginx/nginx.conf /opt/
整个目录
docker cp nginx-test:/etc/nginx/ /opt/  

导出容器镜像或者离线镜像

docker images
REPOSITORY      TAG             IMAGE ID       CREATED        SIZE
alpine          latest          c1aabb73d233   2 months ago   7.33MB
 docker save -o alpine-out.tar alpine:latest
 ls -l alpine-out.tar 
-rw-------. 1 root root 7630848 Aug 14 07:47 alpine-out.tar
docker rmi alpine:latest
Untagged: alpine:latest
 docker rmi alpine:latest
Error response from daemon: No such image: alpine:latest
docker images
REPOSITORY      TAG             IMAGE ID       CREATED        SIZE


 docker load -i alpine-out.tar 
Loaded image: alpine:latest
docker images
REPOSITORY      TAG             IMAGE ID       CREATED        SIZE
alpine          latest          c1aabb73d233   2 months ago   7.33MB

dockerfile参数说明

指令 作用
FROM 从最基础镜像构建 ,全新制作镜像,可以 FROM scratch, scratch它是个空镜像。
ADD 将本地的文件,添加到镜像中去将本地的文件,添加到镜像中去
RUN 构建中执行的shell 命令
CMD 类似于RUN指令,CMD 在docker run 时运行,而非docker build. 一个DockerFile中只能有一个cmd指令。
LABEL 镜像的注释信息。可以注明应用的版本号,创建日期,谁创建的等等。
EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。具体端口映射,还是需要docker run -p <宿主端口>:<容器端口> 实际来进行映射。
ENV ENV指令将环境变量<key>设置为 value <value>。该值将在构建阶段的所有后续指令的环境中,也可以在许多中[内联替换]
ARG ARG指令定义了一个变量,用户可以在构建时通过使用 标志的docker build命令将其传递给构建器, 也可以替代ENV , 因为ARG不会修改镜像内的系统环境变量。只会在构建中起作用。
COPY 用于容器与主机之间的数据拷贝。
ENTRYPOINT ENTRYPOINT 的目的和 CMD 一样 ,增强版的cmd,可以运行.sh 脚本在run 之前做一些预处理的工作,以及可以跟cmd 集合一起使用。
VOLUME 数据卷,实现数据持久化 。*数据不随着Container的删除而丢失,需要将数据挂载到本地宿主机的某个文件或目录。从而实现容器之间的数据共享等, 简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
USER 默认是root用户,可以切换用户, USER Zhangtl
WORKDIR 相当于设置容器的工作目录了, 容器启动时执行的命令会在该目录下执行, 如果不存在,即使它没有在任何后续指令中使用,它也会被创建。
ONBUILD 在使用ONBUILD命令时,其后面跟着的其他命令在当前镜像构建时不会被执行,以其为基础镜像源,构建下级镜像源时才会执行
HEALTHCHECK 可以出现一次,结合CMD 、RUN 等可以细节化验证容器中的服务是否正常。

演示案例

# 准备好app.py 程序和DockeFile
#ls
app.py  Dockerfile

# 准备py运行文件
#cat app.py 
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, World!'

# 编写DockerFile
#vim Dockerfile 
FROM python:3.9.5-slim
COPY app.py /src/app.py
RUN pip install flask
WORKDIR /src
ENV FLASK_APP=app.py
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]

# 开始构建镜像
#docker build -t hellon1 . 

# 检查镜像
#docker images
REPOSITORY      TAG             IMAGE ID       CREATED         SIZE
hellon1         latest          18aeffc502da   4 seconds ago   126MB

# 运行容器
#docker run --name n1 -p 9999:5000 -d hellon1
55859b9bc78e8750d4a78fa47ae84652635c888ff7c329e897c59f5ff396384e

# 验证服务
#curl http://127.0.0.1:9999
Hello, World

将现有的镜像进行打包生成新的镜像

通过 -f 选项指定具体文件路径
docker build -f /path/to/a/Dockerfile -t imagename:tag  .


# docker commit -a "car" -m "cat1" -p 5585 new:v1
sha256:fe22ae3110ea469414206f53dc5f50ad9de6842ba1d877adf0eb383e1b5c3968
# 参数说明
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

# docker images
REPOSITORY      TAG             IMAGE ID       CREATED          SIZE
new             v1              fe22ae3110ea   6 seconds ago    126MB

# docker run --name flask1 -p 7888:5000 -d new:v1
5c21e56c403946df2201edf2ce8426d4c1b3ab1da7e8eeb38316f168fece7de4
# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                               NAMES
5c21e56c4039   new:v1      "flask run -h 0.0.0.0"   3 seconds ago    Up 2 seconds    0.0.0.0:7888->5000/tcp, :::7888->5000/tcp           flask1

数据库时区修改的三种方式

原容器 docker ps -a  名称为 pre-mysql
docker stop pre-mysql
docker rm pre-mysql
 docker run -p 20001:3306 --name pre-mysql -e TZ=Asia/Shanghai -v /data/pre/conf:/etc/mysql/conf.d -v /data/pre/logs:/var/log/mysql -v /data/pre/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxxxxxxx -d cbe8815cbea8  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

第二种方式是 去容器里面ln -fsv  /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
第三种方式 启动参数加 -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime

两个容器公用一个本机目录

创建带有持久卷的容器,持久卷的目录/data/volume
# docker run --name volume2 -itd -v /data/volume:/tmee new:v1 bash
ac7ca5f896e032fa56ce9268b8bd066e6a594966c40f298e47090e7cb339d5d7
# docker run --name volume1 -itd -v /data/volume:/tmee new:v1 bash
ac7ca5f896e032fa56ce9268b8bd066e6a594966c40f298e47090e7cb339d5d7

# docker ps -a 
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                               NAMES
ac7ca5f896e0   new:v1      "bash"                   58 seconds ago   Up 57 seconds   5000/tcp                                            volume2
45b72fb3aee6   new:v1      "bash"                   2 minutes ago    Up 2 minutes    5000/tcp                                            volume1

# docker exec -it volume2 cat /tmee/2
123
# docker exec -it volume1 cat /tmee/2
123

三个容器公用一个volume

# cat Dockerfile 
FROM python:3.9.5-slim
COPY app.py /src/app.py
RUN pip install flask
WORKDIR /src
ENV FLASK_APP=app.py
EXPOSE 5000
CMD [ "flask", "run", "-h", "0.0.0.0" ]
# docker build -t hello-bai -f /data/test/Dockerfile .

# cat app.py 
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, World!'

# docker images
REPOSITORY      TAG             IMAGE ID       CREATED        SIZE
new             v1              fe22ae3110ea   22 hours ago   126MB
hellon2         latest          7d25c0f5003f   23 hours ago   41.1MB
hellon1         latest          18aeffc502da   24 hours ago   126MB
hello-bai       latest          5d3aa9030a27   24 hours ago   126MB

# docker run -itd --name flask_test1 -p 7777:5000 -v flask/src hello-bai
efd04dd94c76ae7ad7ff1a6f1971685419958753f49c3361ff20861746cf895d

# docker volume inspect flask
[
    {
        "CreatedAt": "2023-08-15T08:24:39Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/flask/_data",
        "Name": "flask",
        "Options": null,
        "Scope": "local"
    }
]
[root@gcp-hongkong-doc03 test]# curl 127.0.0.1:7777
Hello, World!

然后创建另外2个
docker run -itd --name flask_test3  -p 7778:5000 -v flask:/src hello-bai
docker run -itd --name flask_test4  -p 7779:5000 -v flask:/src hello-bai

# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                               NAMES
1a749c52cf78   hello-bai   "flask run -h 0.0.0.0"   7 minutes ago    Up 7 minutes    0.0.0.0:7779->5000/tcp, :::7779->5000/tcp           flask_test4
926af6b2c3b3   hello-bai   "flask run -h 0.0.0.0"   7 minutes ago    Up 7 minutes    0.0.0.0:7778->5000/tcp, :::7778->5000/tcp           flask_test3
162c98c0e713   hello-bai   "flask run -h 0.0.0.0"   9 minutes ago    Up 9 minutes    0.0.0.0:7777->5000/tcp, :::7777->5000/tcp           flask_test1

# docker exec -it flask_test4 bash
root@1a749c52cf78:/src# ls
__pycache__  app.py
root@1a749c52cf78:/src# cat app.py 
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, bai!'

这个地方要重启后才能看到新的配置文件
# docker restart flask_test4
flask_test4

# curl 127.0.0.1:7779
Hello, bai!

容器日志处理

# docker ps | grep flask #  查看关键字flask活着的容器
# docker logs -f flask_test2 # flask_test2 为容器的名字
获取某个时段的10条日志
docker logs -t --since="2023-07-01" --tail=10 flask_test2 

日志过滤
docker logs -t --since="2023-07-01" --tail=10 flask_test2 | grep 200

查看4分钟之前的日志
docker logs --until  "4m"  flask_test2

某个时间段的日志
docker logs -t --since="2023-08-01T13:23:37" --until "2023-08-01T16:20:37" flask_test2

日志导出本地
docker logs -t --since="2023-08-01T13:23:37" --until "2023-08-01T16:20:37" flask_test2 | grep 200 > error.log

docker-compose下载

# sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 12.1M  100 12.1M    0     0  8830k      0  0:00:01  0:00:01 --:--:-- 38.4M
# sudo chmod +x /usr/local/bin/docker-compose
#  sudo ln -nfsv /usr/local/bin/docker-compose /usr/bin/docker-compose
‘/usr/bin/docker-compose’ -> ‘/usr/local/bin/docker-compose’
# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

compose 文件结构与版本

version: "3.8"  # 注明了 Compose 文件语法版本

services: # 容器,负数的,下面可以定义多个容器。
  servicename: # 服务名字,run 命令中 --name ,这个名字也是内部 bridge网络可以使用的 DNS name
    image: # 镜像的名字
    command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
    environment: # 可选,相当于 docker run里的 --env
    volumes: # 可选,相当于docker run里的 -v
    networks: # 可选,相当于 docker run里的 --network
    ports: # 可选,相当于 docker run里的 -p
  servicename2:

volumes: # 可选,相当于 docker volume create

networks: # 可选,相当于 docker network create

docker-compose 写的全的链接

https://gitee.com/zhengqingya/docker-compose#elasticsearch

猜你喜欢

转载自blog.csdn.net/startfefesfe/article/details/132276113