首页
关于
友链
Search
1
wlop 4K 壁纸 4k8k 动态 壁纸
1,509 阅读
2
Nacos持久化MySQL问题-解决方案
958 阅读
3
Docker搭建Typecho博客
762 阅读
4
滑动时间窗口算法
746 阅读
5
Nginx反向代理微服务配置
715 阅读
生活
解决方案
JAVA基础
JVM
多线程
开源框架
数据库
前端
分布式
框架整合
中间件
容器部署
设计模式
数据结构与算法
安全
开发工具
百度网盘
天翼网盘
阿里网盘
登录
Search
标签搜索
java
javase
docker
java8
springboot
thread
spring
分布式
mysql
锁
linux
redis
源码
typecho
centos
git
map
RabbitMQ
lambda
stream
少年
累计撰写
189
篇文章
累计收到
24
条评论
首页
栏目
生活
解决方案
JAVA基础
JVM
多线程
开源框架
数据库
前端
分布式
框架整合
中间件
容器部署
设计模式
数据结构与算法
安全
开发工具
百度网盘
天翼网盘
阿里网盘
页面
关于
友链
搜索到
28
篇与
的结果
2023-05-10
Docker数据存储
Docker数据存储默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层:如果容器被删除了,则数据也没有了这个可写的容器层是和特定的容器绑定的,也就是这些数据无法方便的和其它容器共享Docker主要提供了两种方式做数据的持久化Data Volume, 由Docker管理,(/var/lib/docker/volumes/ Linux), 持久化数据的最好方式Bind Mount,由用户指定存储的数据具体mount在系统什么位置一、Data Volume环境准备准备一个Dockerfile 和一个 my-cron的文件$ ls Dockerfile my-cron $ more Dockerfile FROM alpine:latest RUN apk update RUN apk --no-cache add curl ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \ SUPERCRONIC=supercronic-linux-amd64 \ SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e RUN curl -fsSLO "$SUPERCRONIC_URL" \ && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \ && chmod +x "$SUPERCRONIC" \ && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \ && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic COPY my-cron /app/my-cron WORKDIR /app VOLUME ["/app"] # RUN cron job CMD ["/usr/local/bin/supercronic", "/app/my-cron"] $ $ more my-cron */1 * * * * date >> /app/test.txt构建镜像$ docker image build -t my-cron . $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE my-cron latest e9fbd9a562c9 4 seconds ago 24.7MB创建容器(不指定-v参数)此时Docker会自动创建一个随机名字的volume,去存储我们在Dockerfile定义的volume VOLUME ["/app"]$ docker run -d my-cron 9a8fa93f03c42427a498b21ac520660752122e20bcdbf939661646f71d277f8f $ docker volume ls DRIVER VOLUME NAME local 043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264 $ docker volume inspect 043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264 [ { "CreatedAt": "2021-06-22T23:06:13+02:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264/_data", "Name": "043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264", "Options": null, "Scope": "local" } ]在这个Volume的mountpoint可以发现容器创建的文件。创建容器(指定-v参数)在创建容器的时候通过 -v 参数我们可以手动的指定需要创建Volume的名字,以及对应于容器内的路径,这个路径是可以任意的,不必需要在Dockerfile里通过VOLUME定义。比如我们把上面的Dockerfile里的VOLUME删除FROM alpine:latest RUN apk update RUN apk --no-cache add curl ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \ SUPERCRONIC=supercronic-linux-amd64 \ SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e RUN curl -fsSLO "$SUPERCRONIC_URL" \ && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \ && chmod +x "$SUPERCRONIC" \ && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \ && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic COPY my-cron /app/my-cron WORKDIR /app # RUN cron job CMD ["/usr/local/bin/supercronic", "/app/my-cron"]重新build镜像,然后创建容器,加-v参数$ docker image build -t my-cron . $ docker container run -d -v cron-data:/app my-cron 43c6d0357b0893861092a752c61ab01bdfa62ea766d01d2fcb8b3ecb6c88b3de $ docker volume ls DRIVER VOLUME NAME local cron-data $ docker volume inspect cron-data [ { "CreatedAt": "2021-06-22T23:25:02+02:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/cron-data/_data", "Name": "cron-data", "Options": null, "Scope": "local" } ] $ ls /var/lib/docker/volumes/cron-data/_data my-cron $ ls /var/lib/docker/volumes/cron-data/_data my-cron test.txt环境清理强制删除所有容器,系统清理和volume清理$ docker rm -f $(docker container ps -aq) $ docker system prune -f $ docker volume prune -f二、Bind Mount只需要将-v的data volume换成指定路径即可。windows下的linux就可以直接挂载到磁盘,linx的可以直接查看。例如mysqldocker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=密码 \ -d mysql:5.7-v /mydata/mysql/log:/var/log/mysql这里就是将容器中/var/log/mysql日志,通过Bind Mount持久化到linux主机的/mydata/mysql/log目录。多个机器之间的容器共享数据官方参考链接 https://docs.docker.com/storage/volumes/#share-data-among-machinesDocker的volume支持多种driver。默认创建的volume driver都是local$ docker volume inspect vscode [ { "CreatedAt": "2021-06-23T21:33:57Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/vscode/_data", "Name": "vscode", "Options": null, "Scope": "local" } ]这一节我们看看一个叫sshfs的driver,如何让docker使用不在同一台机器上的文件系统做volume环境准备准备三台Linux机器,之间可以通过SSH相互通信。hostnameipssh usernamessh passworddocker-host1192.168.200.10vagrantvagrantdocker-host2192.168.200.11vagrantvagrantdocker-host3192.168.200.12vagrantvagrant安装plugin在其中两台机器上安装一个plugin vieux/sshfs[vagrant@docker-host1 ~]$ docker plugin install --grant-all-permissions vieux/sshfs latest: Pulling from vieux/sshfs Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811 52d435ada6a4: Complete Installed plugin vieux/sshfs[vagrant@docker-host2 ~]$ docker plugin install --grant-all-permissions vieux/sshfs latest: Pulling from vieux/sshfs Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811 52d435ada6a4: Complete Installed plugin vieux/sshfs创建volume[vagrant@docker-host1 ~]$ docker volume create --driver vieux/sshfs \ -o sshcmd=vagrant@192.168.200.12:/home/vagrant \ -o password=vagrant \ sshvolume查看[vagrant@docker-host1 ~]$ docker volume ls DRIVER VOLUME NAME vieux/sshfs:latest sshvolume [vagrant@docker-host1 ~]$ docker volume inspect sshvolume [ { "CreatedAt": "0001-01-01T00:00:00Z", "Driver": "vieux/sshfs:latest", "Labels": {}, "Mountpoint": "/mnt/volumes/f59e848643f73d73a21b881486d55b33", "Name": "sshvolume", "Options": { "password": "vagrant", "sshcmd": "vagrant@192.168.200.12:/home/vagrant" }, "Scope": "local" } ]创建容器挂载Volume创建容器,挂载sshvolume到/app目录,然后进入容器的shell,在/app目录创建一个test.txt文件[vagrant@docker-host1 ~]$ docker run -it -v sshvolume:/app busybox sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox b71f96345d44: Pull complete Digest: sha256:930490f97e5b921535c153e0e7110d251134cc4b72bbb8133c6a5065cc68580d Status: Downloaded newer image for busybox:latest / # / # ls app bin dev etc home proc root sys tmp usr var / # cd /app /app # ls /app # echo "this is ssh volume"> test.txt /app # ls test.txt /app # more test.txt this is ssh volume /app # /app #这个文件我们可以在docker-host3上看到[vagrant@docker-host3 ~]$ pwd /home/vagrant [vagrant@docker-host3 ~]$ ls test.txt [vagrant@docker-host3 ~]$ more test.txt this is ssh volume
2023年05月10日
165 阅读
1 评论
2 点赞
2023-04-25
Dockerfile使用技巧
Dockerfile技巧一、Docker build缓存当build镜像时,如果Docker build文件发生变化或者build镜像分层某一层发生变化就不会使用cache缓存。技巧:将Dockerfile中经常发生改变的放到后面,不发生改变的发前面。这样就算最后发生改变的不能使用cache缓存,但前面没变化也会加快build的速度。Docker build contextDocker是client-server架构,理论上Client和Server可以不在一台机器上。在构建docker镜像的时候,需要把所需要的文件由CLI(client)发给Server,这些文件实际上就是build context。$ dockerfile-demo more Dockerfile FROM python:3.9.5-slim RUN pip install flask WORKDIR /src ENV FLASK_APP=app.py COPY app.py /src/app.py EXPOSE 5000 CMD ["flask", "run", "-h", "0.0.0.0"] $ dockerfile-demo more app.py from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, world!'执行镜像构建$ docker image build -t demo . Sending build context to Docker daemon 11.13MB Step 1/7 : FROM python:3.9.5-slim ---> 609da079b03a Step 2/7 : RUN pip install flask ---> Using cache ---> 955ce495635e Step 3/7 : WORKDIR /src ---> Using cache ---> 1c2f968e9f9b Step 4/7 : ENV FLASK_APP=app.py ---> Using cache ---> dceb15b338cf Step 5/7 : COPY app.py /src/app.py ---> Using cache ---> 0d4dfef28b5f Step 6/7 : EXPOSE 5000 ---> Using cache ---> 203e9865f0d9 Step 7/7 : CMD ["flask", "run", "-h", "0.0.0.0"] ---> Using cache ---> 35b5efae1293 Successfully built 35b5efae1293 Successfully tagged demo:latest. 这个参数就是代表了build context所指向的目录。第2行:Sending build context to Docker daemon 11.13MB,实际就是docker build context将.所指向文件夹里面所有的文件发送到Docker Server。因此当文件里面文件很多时,发送就比较大比较慢,所以进行保证指向的文件夹里面文件少一点。二、.dockerignore 文件配置需要忽略的文件,类似git里面.ignore文件一样。1、可以使image变小一点。2、加快build。3、忽略一些私密配置文件,如密码配置等。.vscode/ env/$ docker image build -t demo . Sending build context to Docker daemon 4.096kB Step 1/7 : FROM python:3.9.5-slim ---> 609da079b03a Step 2/7 : RUN pip install flask ---> Using cache ---> 955ce495635e Step 3/7 : WORKDIR /src ---> Using cache ---> 1c2f968e9f9b Step 4/7 : ENV FLASK_APP=app.py ---> Using cache ---> dceb15b338cf Step 5/7 : COPY . /src/ ---> a9a8f888fef3 Step 6/7 : EXPOSE 5000 ---> Running in c71f34d32009 Removing intermediate container c71f34d32009 ---> fed6995d5a83 Step 7/7 : CMD ["flask", "run", "-h", "0.0.0.0"] ---> Running in 7ea669f59d5e Removing intermediate container 7ea669f59d5e ---> 079bae887a47 Successfully built 079bae887a47 Successfully tagged demo:latest上面可以看到Sending build context to Docker daemon 4.096kB,从这里可以看到Docker build context忽略文件后,发送到docker server的文件变小了很多。三、镜像的多阶段构建适用于需要环境进行编译时。例如要将C语言程序build成一个镜像,然后通过docker容器执行。#include <stdio.h> void main(int argc, char *argv[]) { printf("hello %s\n", argv[argc - 1]); }docker build:因为需要C语言环境,因此选择一个gcc基础镜像,可以看到gcc基础环境比较到,c文件其实很小。FROM gcc:9.4 COPY hello.c /src/hello.c WORKDIR /src RUN gcc --static -o hello hello.c ENTRYPOINT [ "/src/hello" ] CMD []build和测试$ docker build -t hello . Sending build context to Docker daemon 5.12kB Step 1/6 : FROM gcc:9.4 ---> be1d0d9ce039 Step 2/6 : COPY hello.c /src/hello.c ---> Using cache ---> 70a624e3749b Step 3/6 : WORKDIR /src ---> Using cache ---> 24e248c6b27c Step 4/6 : RUN gcc --static -o hello hello.c ---> Using cache ---> db8ae7b42aff Step 5/6 : ENTRYPOINT [ "/src/hello" ] ---> Using cache ---> 7f307354ee45 Step 6/6 : CMD [] ---> Using cache ---> 7cfa0cbe4e2a Successfully built 7cfa0cbe4e2a Successfully tagged hello:latest $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello latest 7cfa0cbe4e2a 2 hours ago 1.14GB gcc 9.4 be1d0d9ce039 9 days ago 1.14GB $ docker run --rm -it hello docker hello docker $ docker run --rm -it hello world hello world $ docker run --rm -it hello friends hello friends $gcc 9.4 be1d0d9ce039 9 days ago 1.14GB实际上当我们把hello.c编译完以后,并不需要这样一个大的GCC环境,一个小的alpine镜像就可以了。因此就可以使用多阶段构建。FROM gcc:9.4 AS builder COPY hello.c /src/hello.c WORKDIR /src RUN gcc --static -o hello hello.c FROM alpine:3.13.5 COPY --from=builder /src/hello /src/hello ENTRYPOINT [ "/src/hello" ] CMD []说明:AS 给gcc取一个名称builder,第2阶段COPY --from=builder /src/hello /src/hello,将编译好的c程序,放到新基础镜像alpine中,重新build成镜像。测试$ docker build -t hello-apline -f Dockerfile-new . Sending build context to Docker daemon 5.12kB Step 1/8 : FROM gcc:9.4 AS builder ---> be1d0d9ce039 Step 2/8 : COPY hello.c /src/hello.c ---> Using cache ---> 70a624e3749b Step 3/8 : WORKDIR /src ---> Using cache ---> 24e248c6b27c Step 4/8 : RUN gcc --static -o hello hello.c ---> Using cache ---> db8ae7b42aff Step 5/8 : FROM alpine:3.13.5 ---> 6dbb9cc54074 Step 6/8 : COPY --from=builder /src/hello /src/hello ---> Using cache ---> 18c2bce629fb Step 7/8 : ENTRYPOINT [ "/src/hello" ] ---> Using cache ---> 8dfb9d9d6010 Step 8/8 : CMD [] ---> Using cache ---> 446baf852214 Successfully built 446baf852214 Successfully tagged hello-apline:latest $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-alpine latest 446baf852214 2 hours ago 6.55MB hello latest 7cfa0cbe4e2a 2 hours ago 1.14GB demo latest 079bae887a47 2 hours ago 125MB gcc 9.4 be1d0d9ce039 9 days ago 1.14GB $ docker run --rm -it hello-alpine docker hello docker $ docker run --rm -it hello-alpine world hello world $ docker run --rm -it hello-alpine friends hello friends $Sending build context to Docker daemon 5.12kB 可以看到这个镜像非常小,只有6.55MB。四、尽量使用非root用户Root的危险性假如我们有一个用户,叫demo,它本身不具有sudo的权限,所以就有很多文件无法进行读写操作,比如/root目录它是无法查看的。但是有执行docker容器的权限,可以映射root文件路径,查看root文件。[demo@docker-host ~]$ sudo ls /root [sudo] password for demo: demo is not in the sudoers file. This incident will be reported. [demo@docker-host ~]$但是这个用户有执行docker的权限,也就是它在docker这个group里。[demo@docker-host ~]$ groups demo docker [demo@docker-host ~]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest a9d583973f65 2 days ago 1.23MB [demo@docker-host ~]$这时,我们就可以通过Docker做很多越权的事情了,比如,我们可以把这个无法查看的/root目录映射到docker container里,你就可以自由进行查看了。[demo@docker-host vagrant]$ docker run -it -v /root/:/root/tmp busybox sh / # cd /root/tmp ~/tmp # ls anaconda-ks.cfg original-ks.cfg ~/tmp # ls -l total 16 -rw------- 1 root root 5570 Apr 30 2020 anaconda-ks.cfg -rw------- 1 root root 5300 Apr 30 2020 original-ks.cfg ~/tmp #更甚至我们可以给我们自己加sudo权限。我们现在没有sudo权限。[demo@docker-host ~]$ sudo vim /etc/sudoers [sudo] password for demo: demo is not in the sudoers file. This incident will be reported. [demo@docker-host ~]$但是我可以给自己添加。[demo@docker-host ~]$ docker run -it -v /etc/sudoers:/root/sudoers busybox sh / # echo "demo ALL=(ALL) ALL" >> /root/sudoers / # more /root/sudoers | grep demo demo ALL=(ALL) ALL然后退出container,bingo,我们有sudo权限了。[demo@docker-host ~]$ sudo more /etc/sudoers | grep demo demo ALL=(ALL) ALL [demo@docker-host ~]$如何使用非root用户我们准备两个Dockerfile,第一个Dockerfile如下,其中app.py文件源码:FROM python:3.9.5-slim RUN pip install flask COPY app.py /src/app.py WORKDIR /src ENV FLASK_APP=app.py EXPOSE 5000 CMD ["flask", "run", "-h", "0.0.0.0"]假设构建的镜像名字为 flask-demo第二个Dockerfile,使用非root用户来构建这个镜像,名字叫 flask-no-root Dockerfile如下:通过groupadd和useradd创建一个flask的组和用户通过USER指定后面的命令要以flask这个用户的身份运行FROM python:3.9.5-slim RUN pip install flask && \ groupadd -r flask && useradd -r -g flask flask && \ mkdir /src && \ chown -R flask:flask /src USER flask COPY app.py /src/app.py WORKDIR /src ENV FLASK_APP=app.py EXPOSE 5000 CMD ["flask", "run", "-h", "0.0.0.0"]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE flask-no-root latest 80996843356e 41 minutes ago 126MB flask-demo latest 2696c68b51ce 49 minutes ago 125MB python 3.9.5-slim 609da079b03a 2 weeks ago 115MB分别使用这两个镜像创建两个容器$ docker run -d --name flask-root flask-demo b31588bae216951e7981ce14290d74d377eef477f71e1506b17ee505d7994774 $ docker run -d --name flask-no-root flask-no-root 83aaa4a116608ec98afff2a142392119b7efe53617db213e8c7276ab0ae0aaa0 $ docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 83aaa4a11660 flask-no-root "flask run -h 0.0.0.0" 4 seconds ago Up 3 seconds 5000/tcp flask-no-root b31588bae216 flask-demo "flask run -h 0.0.0.0" 16 seconds ago Up 15 seconds 5000/tcp flask-root
2023年04月25日
163 阅读
0 评论
0 点赞
2023-04-08
Docker镜像创建、镜像push
镜像创建、镜像push是什么Dockerfile是用于构建docker镜像的文件Dockerfile里包括了构建镜像所需的“指令”Dockerfile有其特定的语法规则基本结构例如:在一台ubuntu 21.04上运行下面这个hello.py的Python程序不用daocker步骤:1、编写hello.py文件。print("hello docker")2、准备Python环境apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev3、运行hello.py$ python3 hello.py hello docker使用Dockerfile构建镜像后就这样FROM ubuntu:20.04 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev ADD hello.py / CMD ["python3", "/hello.py"]说明:FROM:导入一个基础镜像RUN:要运行的linx命令ADD:添加文件到docker镜像的指定目录CMD:使用该镜像创建容器的时候,要执行的命令。构建镜像将写好的hello.py文件和Dockerfile文件放在一起进入该目录。构建镜像docker image build -t 容器名称:版本 构建镜像存放路径例如:docker image build -t hello .注意:如果不写版本号默认是latest。t:表示标签例如,构建上面的py镜像:docker image build -t i2cn/hello:1.0 .构建镜像名称是hell,版本默认是latest,存放位置当前文件夹下。注意:因为是根据一个image创建的,image的id是相同。镜像提交到DockerHub需要符合DockerHub命名规范。根据现有image修改tag生成一个新image tag:docker image tag 容器名称 新容器名称/名称:版本docker image tag i2cn/hello:1.0 i2cn/hello:1.1.0登录DockerHhub:docker login会提示输入用户名密码。推送自定义镜像到DockerHubdocker image push 镜像名称:tag注意:如果是要推送到自己的DockerHub一定要取一个自己账号开头的镜像名称。例如推送上面自己构建的镜像:docker image push i2cn/hello:1.0打开Docker hub自己仓库,就可以看到push的镜像了。测试拉去push的镜像删除本地镜像:docker image rm i2cn/hello:1.0从新拉取推送到dockerhub的镜像docker image pull i2cn/hello:1.0执行镜像:docker container run -it i2cn/hello:1.0可以看到输出:hello docker测试成功。commit创建镜像将现有容器的改变,commit成一个新的镜像。例如:启动一个nginx容器,修改nginx的欢迎页面信息,然后重新commit成一个新的镜像,如果要使用改变后的nginx容器,则可以直接执行commiit后的镜像即可。执行nginx镜像,运行nginx容器,查看nginx首页。docker container run -d -p 80:80 nginx进入nginx修改首页信息docker exec -it 8872c sh进入nginx容器首页文件路径cd /usr/share/nginx/html修改首页信息echo "<h1>hello word </h1>" > index.html用echo命令,将“hello word ”写入index.html查看首页信息重点:使用commit命令,将修改后的nginx容器,commit成一个镜像。停止nginx容器运行docker container stop 8872ccommit容器成一个新镜像:docker container commit 8872 i2cn/nginx:1.0.0查看通过commit新生成的镜像:创建容器,commit创建镜像1、创建ubuntu容器docker container run -it ubuntu:21.04 sh2、在ubuntu容器里面安装Python环境apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev3、创建hello.py文件,打印hello dockerecho "print('hello docker')" > /hello.py4、推出ubuntu容器,通过commit打包ubuntu容器。docker container commit ubuntu i2cn/pydemo:1.05、通过打包后的pydemo:1.0镜像运行容器。docker container run i2cn/pydemo:1.0 python3 /hello.py 这种方法和离线导入导出不怎么使用。查看镜像分层docker image history 镜像名称例如查看nginx分层信息docker image history nginxscratch特殊镜像scratch镜像是一个为空的基础镜像。
2023年04月08日
158 阅读
0 评论
1 点赞
2023-03-18
Docker镜像3种获取方式
Docker镜像获取方式一、pull from registry必须在线,从registry拉取分公有和私有。公有,例如:dockerhub,私有,例如公司自己搭建的,只能公司内部访问。常用公有registry:需要注册账号。https://hub.docker.com/https://quay.io/镜像操作常用命令:查看镜像操作帮助:docker image拉取镜像:docker image pull 容器名称 可以简写成 docker pull 容器命令注意:默认拉取官方latest版本。例如拉取nginx:docker pull nginx查看本地已经拉取的镜像:docker image ls拉取指定版本镜像:docker image pull 容器名称:版本例如拉取nginx1.20.0版本镜像docker image pull nginx:1.20.0拉取其他registry镜像docker pull quay.io/jitesoft/nginx查看镜像详细信息docker image inspeack 镜像id例如查看nginx镜像详细信息:docker image inspect 7ab27删除镜像docker image rm 镜像命令或者id例如删除nginx镜像:docker image rm 7ab注意:不能删除正在使用镜像,否则会报错。必选删除正在使用的容器,才能删除,停止容器也不行docker image rm 605提示“Error response from daemon: conflict: unable to delete 605c77e624dd (cannot be forced) - image is being used by running container 3a79cefa5c8e”停止容器,删除也不行:必选先删除相关容器,才能删除:二、build from Dockerfile必须在线,因为需要一些基础包,从Dcokerfile构建。后面专门介绍这种方式构建镜像。三、load from file离线,文件导入。导出镜像文件docker image save 镜像名称:版本 -o 导出后镜像名称.image例如到处ngxin镜像:docker image save nginx:1.20.0 -o nginx.image导入镜像文件将导出的文件拷贝到需要使用的电脑上,通过下面命令导入。docker image load -i /root/nginx.image第1种最简单,第2种最复杂,但是也是最常用的,重点学习第2中。第3中相对简单一点。
2023年03月18日
204 阅读
0 评论
2 点赞
2023-03-14
docker入门
容器:一种打包技术。docker:打包技术的一种技术实现。一、基础知识基础命令查看docker相关信息docker versoin查看docker环境信息docker info查看命令帮助docker --helpimage镜像image是一个只读文件,里面包含文件系统、源码、可文件、依赖、工具等一些运行application所需的文件,可以理解成一个模板。docker image具有分层的概念。container容器一个运行中的“docker image”。是指是复制image并在image最上层加上一层读写的层。基于同一个image可以创建多个container。image获取方式1、自己制作2、从registry拉取,比如docker hub创建容器查看容器帮助命令docker container --help当没有拉取镜像时,会自动拉取。查看当前运行了那些容器:docker container lsid:唯一的id。image:使用的镜像。command:执行的命令created:创建时间,这里是2分钟之前。status:状态ports:端口协议names: 容器名称,不设置时,随机产生一个。创建容器:docker container run 镜像命令例如:创建nginx容器dockekr container run nginx注意:此时是在窗口运行,ctrl+c会停止运行容器。关闭容器docker stop 容器名称或者容器id例如:关闭nginx查看容器信息:docker container list关闭容器:docker container 7b51查看容器查看运行中的容器docker container list查看创建过或者使用过的容器docker container ps -a 或者 docker container ls -a区别:ps是早点docker里面使用的参数,docker container --help里面看不到,只看得见list的参数。删除容器docker container rm 容器命令或者id例如:删除nginx容器docker container rm 7b注意大部分的命令container是可以省略的。例如:创建容器: docker run nginx 查看容器: docker ps -a 停止容器: docker stop nginx 删除容器: docker rm nginx建议,还是带上container,清晰表示是在对容器操作,因为后面还有对镜像image的操作。二、小技巧批量操作比如:批量删除容器,如何操作?正常情况删除容器1、查看所有容器docker container ls -a2、删除多个容器docker container rm 容器1的ID 容器2的ID 容器3的ID 容器4的ID同时删除容器1、2、3、4。但是如果有很多个,就可以通过参数传递批量删除。批量删除1、查看所有容器iddocker container ls -aq2、参数传递批量删除docker container rm $(docker container ls -aq)批量关闭、删除同理。注意不能删除正在运行的容器。删除运行中的容器查看运行中的容器docker container li直接删除会提示容器正在运行不能删除。docker container rm nginx删除运行中容器1、停止容器,再删除。停止 docker container stop 681 再删除 docker container rm 6812、强制删除容器docker container rm c3e -f注意:强制删除多个一个参数 -f三、docker两种运行模式attached前台运行模式docker container run -p 80:80 nginxctrl+c在窗口创建容器后,界面输入创建容器日志,此时ctrl+c关闭后容器就关闭了。查看容器docker psdetached后台运行模式只需要添加参数detached,简写一个d即可。docker container run -d -p 80:80 nginx此时查看容器,依然在后台运行docker ps进入容器只需要加attach参数即可docker container attach其实此时已经进入容器,访问nginx页面刷新,就可看到页面输出日志。此时执行ctrl+c,就会关闭容器。ctrl+c查看容器已经关闭docker ps注意:不推荐attach前台模式。查看日志后台运行模式detached,查看日志。docker container logs 容器id或名称例如查看nginx日志docker container logs nginx动态跟踪日志只需要加参数-fdocker container logs -f 容器id或名称例如:动态跟踪nginx日志docker container logs -f nginx交互式模式1、用于执行创建容器后,执行的命令。只需要加参数-itdocker container run -it 容器名称 容器中要执行的命令例如:创建ubunt容器后,执行sh脚本docker container run -it ubuntu sh此时已经进入ubuntu的sh模式了,可以直接执行命令,查看ubuntu相关信息了。执行exit后执行退出ubuntu,并关闭了。因为我们是在交互模式,容器中执行的exit相当于关闭容器了。另一种进入交互模式办法。2、exec经常使用的容器交互方式docker exec -it 容器名称/容器id sh这样就进入了交互模式。例如,进入nginx容器里面,执行相关操作。docker exec -it nginx sh里面执行exit退出的是nginx的sh,并没有关闭nginx容器。这就是和上面没有exec参数的不同。注意:这是使用最频繁的命令。四、容器运行了那些进程docker top 容器名称/容器id可通过安装pstree查看进程关系树。可以看到创建一个docker容器,实际就是运行了一个脚本,而容器中又运行了其他进程子进程。注意:容器中进程id和实际看到的id是不同的。比如:创建busybox容器,进入容器内查看进程id。docker container run -it busybox sh查看进程ps在容器外部执行查看容器进程命令:docker container top fe0可以看到容器内部查看到的sh脚本进程和容器外部看到的sh脚本进程是不同的。这是由于docker容器隔离形成。五、docker容器运行背后发生了什么以创建nginx容器为列:docker container run -d -p 80:80 --name mynginx nginx说明:在本地查找是否有nginx镜像。如果有镜像,直接执行第4步骤。如果本地没有,去远程image registry查找nginx镜像(默认registry是Docker Hub)下载最新版本nginx镜像(默认nginx:latest)基于nginx镜像来创建一个新的容器,并准备运行。docker engine引擎给这个容器分配一个虚拟ip地址。在宿主机上打开80端口,并把容器的80端口转发到宿主机的80端口上。启动容器,运行指定命令。(启动容器,其实就是执行一个脚本启动nginx)。
2023年03月14日
131 阅读
0 评论
2 点赞
2023-03-02
docker部署kafka
Docker部署Kafka一、拉取镜像docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka二、启动zookpeerdocker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper三、启动kafkadocker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_BROKER_ID=0 \ -e KAFKA_ZOOKEEPER_CONNECT=192.168.56.10:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.56.10:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka注意修改自己ip地址四、测试1、进入kafka容器docker exec -it kafka bash2、进入kafak脚本目录cd /opt/kafka_2.13-2.8.1/bin注意修改自己kafka版本3、创建主题kafka-topics.sh --create --zookeeper 192.168.56.10:2181 --replication-factor 1 --partitions 1 --topic topic_1 这里创建了一个topic_1主题。4、添加消息生产者发送消息kafka-console-producer.sh --broker-list 192.168.56.10:9092 --topic topic_1此时进入发送消息界面:5、消费消息消费者消费消息kafka-console-consumer.sh --bootstrap-server 192.168.56.10:9092 --topic topic_1 --from-beginning测试进入消费消息窗口:
2023年03月02日
239 阅读
0 评论
0 点赞
2022-11-29
Docker安装ShowDoc ssl https nginx配置
Docker安装ShowDoc ssl https nginx配置一、docker安装showdoc1、拉取镜像# 中国大陆镜像安装命令(安装后记得执行docker tag命令以进行重命名)docker pull registry.cn-shenzhen.aliyuncs.com/star7th/showdoc docker tag registry.cn-shenzhen.aliyuncs.com/star7th/showdoc:latest star7th/showdoc:latest 2、创建showdoc数据目录mkdir -p /mydata/showdoc/showdoc_data/html chmod -R 777 /mydata/showdoc/showdoc_data3、启动容器docker run -d --name showdoc --user=root --privileged=true -p 4999:80 \ -v /mydata/showdoc/html:/var/www/html/ star7th/showdoc4、设置随容器启动docker update --restart=always showdoc此时旧可以通过IP+port访问了,注意,端口放行,云服务器白名单开启。二、showdoc配置https、ssl、nginx配置nginx https、ssl配置如下:server { listen 443 ssl; server_name doc.yanxizhu.com; client_max_body_size 1000m; ssl on; ssl_certificate /etc/nginx/conf.d/key/doc.yanxizhu.com_bundle.crt; ssl_certificate_key /etc/nginx/conf.d/key/doc.yanxizhu.com.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location ^~ / { proxy_pass http://自己云服务器ip:4999/; proxy_redirect off; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header http_user_agent $http_user_agent; } } server { listen 80; server_name doc.yanxizhu.com; rewrite ^(.*) https://doc.yanxizhu.com$1 permanent; }注意:修改自己域名和对应端口。此时就可以通过域名https://doc.yanxizhu.com/访问了。
2022年11月29日
227 阅读
0 评论
2 点赞
2022-10-27
CentOS安装Sentinel并自启动
CentOS安装Sentinel设置自启动1、下载下载地址https://github.com/alibaba/Sentinel/releases2、安装提前创建好安装路径、Jar包存放文件夹、脚本执行文件夹、日志存放文件夹mkdir /usr/local/ sentinel mkdir /usr/local/sentinel jar mkdir /usr/local/sentinel sh mkdir /usr/local/sentinel log将sentinel-dashboard-1.8.6.jar执行Jar包上传至jar文件夹3、脚本编写脚本sentinel.sh,按照自己路径、版本号调整,存放到上面新建的sh文件夹中。脚本如下:#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 SENTINEL_NAME=sentinel-dashboard-1.8.6.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh sentinel.sh [start|stop|restart|status]" exit 1 } #检查程序是否在运行 is_exist(){ pid=`ps -ef|grep $SENTINEL_NAME|grep -v grep|awk '{print $2}' ` #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi } #启动方法 start(){ is_exist if [ $? -eq "0" ]; then echo "${SENTINEL_NAME} is already running. pid=${pid} ." else nohup java -Dserver.port=9100 -Dcsp.sentinel.dashboard.server=192.168.56.10:9100 -Dproject.name=sentinel-dashboard -jar /usr/local/sentinel/jar/$SENTINEL_NAME > /usr/local/sentinel/log/sentinellog.file 2>&1 & #nohup java -jar /usr/local/sentinel/jar/$SENTINEL_NAME > /usr/local/sentinel/log/sentinellog.file 2>&1 & echo "${SENTINEL_NAME} start success" fi } #停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid else echo "${SENTINEL_NAME} is not running" fi } #输出运行状态 status(){ is_exist if [ $? -eq "0" ]; then echo "${SENTINEL_NAME} is running. Pid is ${pid}" else echo "${SENTINEL_NAME} is NOT running." fi } #重启 restart(){ stop start } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac进入/usr/local/sentinel/sh/文件夹下,执行命令修改权限chmod +x sentinel.sh注意:1、如果直接复制到windows中文本的,注意windows和linx的换行符不同,导致启动失败,可使用notepad++中编辑-->文档格式转换-->转换成Unix格式。2、注意给脚本设置权限4、测试本地测试是否能够启动启动sentinel服务sh sentinel.sh start停止sentinel服务sh sentinel.sh stop重启sentinel服务sh sentinel.sh restart查看sentinel服务状态sh sentinel.sh status服务启动后,可通过IP+端口+项目名访问Sentinel登录页面5、自启动本地测试可通过命令启动没问题后,编写启动服务sentinel.service,放到/usr/lib/systemd/system目录,内容如下:[Unit] Description=sentinel After=network.target [Service] Environment="JAVA_HOME=/usr/local/java/jdk-11.0.10" Type=forking ExecStart=/usr/local/sentinel/sh/sentinel.sh start ExecReload=/usr/local/sentinel/sh/entinel.sh stop ExecStop=/usr/local/sentinel/sentinel/sh/sentinel.sh restart PrivateTmp=true [Install] WantedBy=multi-user.target重载所有服务systemctl daemon-reload设置开机启动systemctl enable sentinel.service查看开机启动状态systemctl is-enabled sentinel.service查看服务状态systemctl status sentinel手动启动 Sentinelsystemctl start sentinel手动停止Sentinelsystemctl stop sentinel手动重启Sentinelsystemctl restart sentinel6、结果根据启动日志INFO: Sentinel log output type is: file INFO: Sentinel log charset is: utf-8 INFO: Sentinel log base directory is: /root/logs/csp/ INFO: Sentinel log name use pid is: false INFO: Sentinel log level is: INFO . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.5.12) 2022-10-27 15:07:50.068 INFO 733 --- [ main] c.a.c.s.dashboard.DashboardApplication : Starting DashboardApplication using Java 11.0.10 on 10.0.2.15 with PID 733 (/usr/local/sentinel/jar/sentinel-dashboard-1.8.6.jar started by root in /) 2022-10-27 15:07:50.280 INFO 733 --- [ main] c.a.c.s.dashboard.DashboardApplication : No active profile set, falling back to 1 default profile: "default" 2022-10-27 15:08:54.090 INFO 733 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9100 (http) 2022-10-27 15:08:54.616 INFO 733 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-10-27 15:08:54.616 INFO 733 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.60] 2022-10-27 15:08:57.256 INFO 733 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-10-27 15:08:57.259 INFO 733 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 40159 ms 2022-10-27 15:08:58.193 INFO 733 --- [ main] c.a.c.s.dashboard.config.WebConfig : Sentinel servlet CommonFilter registered 2022-10-27 15:09:04.587 INFO 733 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9100 (http) with context path '' 2022-10-27 15:09:04.788 INFO 733 --- [ main] c.a.c.s.dashboard.DashboardApplication : Started DashboardApplication in 79.475 seconds (JVM running for 82.322) 2022-10-27 15:09:13.768 INFO 733 --- [nio-9100-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2022-10-27 15:09:13.807 INFO 733 --- [nio-9100-exec-3] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2022-10-27 15:09:14.119 INFO 733 --- [nio-9100-exec-3] o.s.web.servlet.DispatcherServlet : Completed initialization in 311 ms启动成功,通过访问IP+端口+项目,成功访问到Sentinel登录页面,账号:sentinel,密码:sentinel
2022年10月27日
270 阅读
0 评论
2 点赞
2022-10-24
CenotOS环境Nacos安装,设置开机自启动
CenotOS环境Nacos安装,设置开机自启动1、下载nacos下载地址:https://github.com/alibaba/nacos/releases2、安装进入nacos所在目录,执行如下命令tar -zxvf nacos-server-2.0.3.tar.gz -C /usr/local/3、单机启动修改/usr/local/nacos/bin目录下startup.sh启动文件设置单机启动,修改export MODE="cluster"值为standaloneexport MODE="standalone"4、启动测试进入/usr/local/nacos/bin目录下,执行启动命令./startup.sh启动失败,查看/usr/local/nacos/logs下start.out日志文件,报错如下:/usr/local/java/jdk-11.0.10/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/usr/local/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 -Dloader.path=/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 Error: Could not find or load main class Caused by: java.lang.ClassNotFoundException: 5、解决方案进入/usr/local/nacos/bin/目录,修改启动文件startup.sh,修改内容如下:x JAVA_OPT_EXT_FIX="-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext" √ JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext" x echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" √ echo "$JAVA ${JAVA_OPT}" x echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & x nohup "$JAVA" "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & √ echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & √ nohup $JAVA ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &x:表示需要替换的,√:表示修改后的。6、再次测试进入/usr/local/nacos/bin目录下,执行启动命令./startup.sh输出结果:/usr/local/java/jdk-11.0.10/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/usr/local/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 -Dloader.path=/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos is starting with standalone nacos is starting,you can check the /usr/local/nacos/logs/start.out表示之前启动问题解决,启动成功。7、访问nacos打开浏览器输入CentOS地址+端口+项目访问,即可看到nacos登录页面。http://192.168.56.10:8848/nacos8、随机启动配置8.1、进入 /lib/systemd/system目录cd /lib/systemd/system8.2、在该目录下,创建文件nacos启动文件vi nacos.service添加内容如下[Unit] Description=nacos After=network.target [Service] Environment="JAVA_HOME=/usr/local/java/jdk-11.0.10" Type=forking ExecStart=/usr/local/nacos/bin/startup.sh -m standalone ExecReload=/usr/local/nacos/bin/shutdown.sh ExecStop=/usr/local/nacos/nacos/bin/shutdown.sh PrivateTmp=true [Install] WantedBy=multi-user.target注意:修改自己nacos所在路径8.3、重载所有服务systemctl daemon-reload8.4、设置开机启动systemctl enable nacos.service8.5、查看开机启动状态systemctl is-enabled nacos.service8.6、查看服务状态systemctl status nacos8.7、手动启动 Nacossystemctl start nacos8.7、手动停止Nacossystemctl stop nacos8.8、手动重启systemctl restart nacos9、测试自启动重启CentOS系统,查看Nacos是否自自动查看Nacos服务状态systemctl status nacos输出结果:● nacos.service - nacos Loaded: loaded (/usr/lib/systemd/system/nacos.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-10-24 15:15:16 UTC; 1min 7s ago Process: 707 ExecStart=/usr/local/nacos/bin/startup.sh -m standalone (code=exited, status=0/SUCCESS) Tasks: 194 Memory: 547.8M CGroup: /system.slice/nacos.service └─748 /usr/local/java/jdk-11.0.10/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/usr/local/nacos/logs/nacos_gc.log:time,tag... Oct 24 15:15:15 10.0.2.15 systemd[1]: Starting nacos... Oct 24 15:15:16 10.0.2.15 startup.sh[707]: /usr/local/java/jdk-11.0.10/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/usr...s.home=/usr/ Oct 24 15:15:16 10.0.2.15 startup.sh[707]: nacos is starting with standalone Oct 24 15:15:16 10.0.2.15 startup.sh[707]: nacos is starting,you can check the /usr/local/nacos/logs/start.out Oct 24 15:15:16 10.0.2.15 systemd[1]: Started nacos. Hint: Some lines were ellipsized, use -l to show in full.表示已经启动成功。通过IP+端口+项目访问登录页面测试http://192.168.56.10:8848/nacos已经可以成功访问Nacos登录页面了。
2022年10月24日
164 阅读
0 评论
1 点赞
1
2
...
4