-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docker学习 #284
Comments
创建镜像
从已经创建的容器中更新镜像当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。 栗子1 用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器 docker run --name webserver -d -p 80:80 nginx 2 使用 docker exec 命令进入容器,修改其内容 docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit 3 [可选] 通过 docker diff 命令看到具体的改动 $ docker diff webserver
C /root
A /root/.bash_history
C /run
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp 4 将修改提交创建镜像 docker commit 的语法格式为: docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
// exp
docker commit \
--author "Tao Wang <[email protected]>" \
--message "修改了默认网页" \
webserver \
nginx:v2 慎用 docker commit
参考使用 Dockerfile 指令来创建一个新的镜像基于 从已经创建的容器中更新镜像 例子使用 Dockerfile 创建镜像 1 创建 Dockerfile 文件 # 创建名为 Dockerfile 的文件
touch Dockerfile 2 编辑 Dockerfile 文件内容 FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html FROM 指定基础镜像 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制 FROM scratch RUN 执行命令
栗子 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN命令注意点 Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。 所以,应该将RUN命令用 && 聚合在一起,比如 RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps 3 构建镜像 使用 docker build 命令进行镜像构建。其格式为: docker build [选项] <上下文路径/URL/-> 参考 |
创建文件服务pollify镜像
|
容器基本使用
查看容器docker ps查看正在运行的容器 docker ps -a 查看指定容器状态使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 $ sudo docker inspect romantic_hamilton
[
{
"Id": "d740b78463699294189ec9bc27c0a24c8c849fbe2d12e3282802ca0dbac86a8e",
"Created": "2022-10-28T10:28:03.192946138Z",
"Path": "docker-entrypoint.sh",
// ...
}
] 启动容器
启动新容器
# 栗子
docker run -it ubuntu /bin/bash 重启容器docker start <容器id> 后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash 进入容器
exec 命令例子: 注意: 如果从这个容器退出,容器不会停止 attach 命令docker attach <容器id> 注意: 如果从这个容器退出,会导致容器的停止。 停止容器docker stop <容器 ID> 删除容器删除容器使用 docker rm 命令: docker rm -f <容器id> 附录参考 |
制作镜像基于已有镜像创建容器,使用终端进入镜像。使用卷,将容器内的修改保存到容器外! 在修改符合预期之后,就可以使用Dockerfile制作镜像! 制作思路:将 容器内的修改 复制到镜像中! 开发#!/bin/bash
docker run --rm -it \
-v /data/home/isaacgan/workspace/kg-file-upload/pollfy_image:/data/svr \
-w /data/svr \
node:16.18.0 \
/bin/bash
Dockerfile# 指定镜像来源
FROM node:16.18.0
LABEL maintainer="isaacgan"
LABEL descrition="kg_file_upload-pollfy_svr"
# 指定奖项的工作目录,指定后下面使用就会基于工作目录解析相对路径
# ./ => /data/svr
WORKDIR /data/svr
# 将当前Dockerfile所有在目录的所有内容 复制 到 ./ 下,即是工作目录
COPY . . build镜像sudo docker build -t node:kg_file_upload_pollfy_svr_v1 ./pollfy_image 基于刚制作的镜像,创建容器并后台运行 #!/bin/bash
docker run -d -p 9113:9113 \
-w /data/svr \
node:kg_file_upload_pollfy_svr_v1 \
node app.js |
编写脚本重启容器 if 启动docker if 容器是否启动 附录参考 |
部署镜像如何将build的镜像部署到生产机器,并且运行?! |
FAQ:将镜像删除,运行中的容器会怎么样?存在依赖关系,删除失败 docker image rm <image>:<tag>
# output
Error response from daemon: conflict: unable to remove repository reference "<image>:<tag>" \
(must force) - container e8a28d0e2432 is using its referenced image 9fcf84b911b2 |
FAQ:启动容器失败启动失败 docker run -itd -p 9113:9113 \
--name="<container name>" \
xxx:v1 \
/data/polyfill_svr/sh/start.sh 可以启动成功
|
自动更新容器版本0 是否安装docker(优先级低)1 判断docker是否启动否则,启动docker faq:如果判断是否启动容器 2 判断是否已有同名容器启动否则,删除已经启动容器 |
win下使用docker
制作dockerfile
安装node
安装nvm考虑到会频繁切换node版本,所以选择安装 nvm 。 安装失败!!! 使用curl安装下载并安装,失败! 看提示,应该是因为没有绑ssh-key导致访问失败。暴露出另外一个问题:在 docker容器使用ssh-key 当前先按下,使用另外的方法! 本地安装现在在浏览器直接下载 nvm 的tar包,然后build dockersfile的时候将它复制到镜像内并执行安装! 重新run镜像,创建容器并挂在卷 winpty docker run -it -v /d/workspace:/data/workspace tme:v2 在查询之后发现是要手动在docker客户端中设置共享目录!!!详细见附录 挂在卷#!/bin/bash
winpty \
docker run --rm -it \
--mount type=bind,source="`pwd`",target="/data/workspace" \
tme:v2 执行脚本安装nvm,失败!安装也是需要下载github资源! 经搜索发现是dns污染导致dns解析失败! 当前的解决方法是直接修改hosts,手动将xx解析到它的实际IP。参考: 如何解决类似 curl: (7) Failed to connect to raw.githu...
遇到的问题
|
![]() |
---|
在改用 --mount type=bind,source="xxx",target="xxx"
语法后正常!
![]() |
---|
附录
设置共享目录
You have to add C:\Users\path_to_my_folder to Docker Filesharing.
Go to docker dashboard -> settings ->Resources -> FileSharing. Add required folder and hit Apply & Restart.
![]() |
---|
参考:Docker : Error response from daemon: user declined directory sharing
docker修改容器hosts
构建时写入
使用 Dockerfile 文件build镜像时,执行命令将hosts写入镜像中 RUN + echo失败! 需要 root权限
RUN + echo失败! 启动容器时提示失败! 容器创建时 hosts并没有创建! 启动时写入使用 docker run --rm -it --privileged=true \
--add-host=raw.githubusercontent.com:185.199.108.133 \ |
Table Of Content
目标
创建node镜像,安装与node10版本有兼容问题的npm报。将此node镜像运行的node v10环境下,访问镜像里面的资源
docker的基础使用
启动docker
测试docker
常见docker命令
--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间docker基本命令释义
运行交互式的容器
使用 -it 命令
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
使用镜像
使用 docker images 列出本机上的镜像
各个选项说明:
创建镜像
附录
参考
命令详解
The text was updated successfully, but these errors were encountered: