Docker – 清风亦平凡 https://www.mlplus.net 关注IT世界,记录平凡生活 Sun, 24 Sep 2023 15:09:15 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.4.3 在Docker容器下使用.net 5统计图中文乱码的问题 https://www.mlplus.net/2023/09/24/docker-draw-image-garbled-code/ https://www.mlplus.net/2023/09/24/docker-draw-image-garbled-code/#respond Sun, 24 Sep 2023 15:09:15 +0000 https://www.mlplus.net/?p=4356 背景

客户新提需求,需要增加一张报表,报表需要增加统计图表。因为客户需要将数据以及统计图表一并导出到word中,所以没有使用前端统计相关的类库,比如:echartshighcharts等库。虽然可以使用前端相关类库导出word,但是并不能满足现有需求。后台服务使用的是.net 5,统计图完成后发现中文出现乱码。如下图:

直方图乱码

问题

出现以上乱码问题,其一可能是统计类库不支持中文导致的,也有可能是docker镜像中缺少相应的中文字体。因为在本地开发环境测试并没有问题,更新到测试环境后才发现以上乱码情况,所以应该是镜像中缺少相关中文字体而导致的。

解决

既然是缺少中文字体,那就安装字体就行了。在Windows系统中复制需要的字体到新建名称为chinese文件夹下,将此文件夹放到与dockerfile同一目录下即可。dockerfile文件中新增内容如下:


RUN apt-get -y  install fontconfig
COPY ./chinese /usr/share/fonts
RUN fc-cache -vf
Windows系统字体所在位置:控制面板\外观和个性化\字体
Linux字体目录是:/usr/share/fonts,所以dockerfile中指定将字体复制到此目录。

dockerfile更改后提交构建镜像并重新运行容器,再次查看效果后发现恢复正常,如下图:

直方图修正乱码

总结

docker中使用的镜像,有时候选择的是最小依赖的基础镜像,镜像比较小。但是一些情况是不满足需求的,在不更改基础镜像的情况下,还是要通过docker相关指令安装所需依赖,例如:一些软件、字体或者其他内容。



转载请注明:清风亦平凡 » 在Docker容器下使用.net 5统计图中文乱码的问题

]]>
https://www.mlplus.net/2023/09/24/docker-draw-image-garbled-code/feed/ 0
Docker构建VUE项目NPM构建134异常 https://www.mlplus.net/2023/02/23/docker-build-npm134-error/ https://www.mlplus.net/2023/02/23/docker-build-npm134-error/#respond Thu, 23 Feb 2023 08:10:53 +0000 https://www.mlplus.net/?p=4131 背景

一个前端的VUE项目,需要打一个Docker的镜像离线包。通过命令行构建镜像,通过等待比较长的时间后,NPM构建抛出异常。

异常内容

以下是关于这次异常的详细信息:

docker构建VUE项目异常图片
=> ERROR [build-stage 10/10] RUN npm run build                                                                 1222.9s
------
 > [build-stage 10/10] RUN npm run build:
#18 7.649
#18 7.649 > vue-antd-admin@0.7.4 build /app
#18 7.649 > vue-cli-service build
#18 7.649
#18 24.59
#18 24.60 -  Building for production...
#18 1221.3
#18 1221.3 <--- Last few GCs --->
#18 1221.3
#18 1221.3 [24:0x40d39c0]  1206698 ms: Mark-sweep (reduce) 986.8 (995.9) -> 986.1 (997.4) MB, 6393.8 / 0.1 ms  (average mu = 0.076, current mu = 0.019) allocation failure scavenge might not succeed
#18 1221.3
#18 1221.3
#18 1221.3 <--- JS stacktrace --->
#18 1221.3
#18 1221.3 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
#18 1221.5  1: 0xa18da8 node::Abort() [/usr/local/bin/node]
#18 1221.5  2: 0x969880 node::FatalError(char const*, char const*) [/usr/local/bin/node]
#18 1221.5  3: 0xb74138 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
#18 1221.5  4: 0xb742c4 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
#18 1221.5  5: 0xd1c820 v8::internal::Heap::EnsureFromSpaceIsCommitted() [/usr/local/bin/node]
#18 1221.5  6: 0xd1d288  [/usr/local/bin/node]
#18 1221.5  7: 0xd2af4c v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/local/bin/node]
#18 1221.5  8: 0xd2e41c v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/usr/local/bin/node]
#18 1221.5  9: 0xd00714 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [/usr/local/bin/node]
#18 1221.5 10: 0x101ba54 v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [/usr/local/bin/node]
#18 1221.5 11: 0x137bb0c  [/usr/local/bin/node]
#18 1221.5 qemu: uncaught target signal 6 (Aborted) - core dumped
#18 1221.7 Aborted
#18 1221.8 npm ERR! code ELIFECYCLE
#18 1221.8 npm ERR! errno 134
#18 1221.8 npm ERR! vue-antd-admin@0.7.4 build: `vue-cli-service build`
#18 1221.8 npm ERR! Exit status 134
#18 1221.8 npm ERR!
#18 1221.8 npm ERR! Failed at the vue-antd-admin@0.7.4 build script.
#18 1221.8 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
#18 1222.0
#18 1222.0 npm ERR! A complete log of this run can be found in:
#18 1222.0 npm ERR!     /root/.npm/_logs/2023-02-16T06_26_23_271Z-debug.log
------
executor failed running [/bin/sh -c npm run build]: exit code: 134


经过查看发现NPM异常退出代码134,通过错误代码了解到应该是内存不足导致的。优先确认自己使用的这台物理机器内存,并未发现问题。应该是Docker本身子系统内存问题,经过查看确认允许内存为2G,这内存允许范围的确可能出现内存不足的问题。将内存设置为4GB后保存,再次构建项目,经过一段时间的等待,Docker镜像构建成功。

Docker构建VUE项目NPM构建134异常-第1张图片

Docker构建VUE项目NPM构建134异常-第2张图片



转载请注明:清风亦平凡 » Docker构建VUE项目NPM构建134异常

]]>
https://www.mlplus.net/2023/02/23/docker-build-npm134-error/feed/ 0
基于dotnet官方的aspnet5的镜像构建安装libgdiplus基础镜像 https://www.mlplus.net/2021/12/18/dotnet-aspnet5-libgdiplus/ https://www.mlplus.net/2021/12/18/dotnet-aspnet5-libgdiplus/#respond Sat, 18 Dec 2021 01:00:00 +0000 https://www.mlplus.net/?p=3696 背景

.net 5应用中,使用了Excel文件处理,在Docker容器中运行就会出现关于libgdiplus的异常。虽然在Dockerfile中可以使用以下内容解决异常,但是这个速度太慢了。每次构建慢的让人怀疑人生,最重要的是还可能失败。

RUN apt-get update && apt-get install -y libgdiplus libc6-dev && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

为了提高构建速度,所以使用官方的基础镜像再二次构建一个基础镜像,默认安装 libgdiplus ,这样每次构建速度就会提升好多好多。默认安装了libgdiplus等库,以便支持Excel导入导出

构建基础镜像的Dockerfile

Dockerfile


FROM mcr.microsoft.com/dotnet/aspnet:5.0

RUN apt-get update && apt-get install -y libgdiplus libc6-dev && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
# 安装fontconfig库,用于Pdf导出
RUN apt-get update && apt-get install -y fontconfig
# 复制字体文件
COPY /simsun.ttc /usr/share/fonts/simsun.ttc

如果CPU架构是ARM架构的话,引用的官方基础镜像包就要做一些调整。详情参考Dockerfile.arm

Dockerfile.arm


FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim-arm64v8

RUN apt-get update && apt-get install -y libgdiplus libc6-dev && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
# 安装fontconfig库,用于Pdf导出
RUN apt-get update && apt-get install -y fontconfig
# 复制字体文件
COPY /simsun.ttc /usr/share/fonts/simsun.ttc

字体文件

字体simsun.ttc

已构建镜像

基于dotnet官方的aspnet5的镜像构建安装libgdiplus基础镜像-第0张图片

如果自己不构建镜像,也可以使用已经构建好的镜像。

docker pull skyfinder/dotnet-aspnet5

ARM架构的CPU可以使用以下镜像

docker pull skyfinder/dotnet-aspnet5-buster-slim-arm64v8



转载请注明:清风亦平凡 » 基于dotnet官方的aspnet5的镜像构建安装libgdiplus基础镜像

]]>
https://www.mlplus.net/2021/12/18/dotnet-aspnet5-libgdiplus/feed/ 0
docker查看日志 https://www.mlplus.net/2021/05/19/docker-log-view/ https://www.mlplus.net/2021/05/19/docker-log-view/#respond Wed, 19 May 2021 04:56:39 +0000 https://www.mlplus.net/?p=3480 在工作当中有时候需要查看指定容器的日志记录,当日志比较多的时可以通过参数来进一步筛选。

命令格式

docker查看日志-第0张图片

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details           显示更多的信息
  -f, --follow           跟踪实时日志
      --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
      --tail string      从日志末尾显示多少行日志, 默认是all
  -t, --timestamps  显示时间戳
      --until string    显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

使用示例

查看指定容器全部日志


docker logs  容器ID或者容器名称

实时查看容器前100条日志


docker logs -f -t --tail 100 容器ID或者容器名称

查看某时间段日志


ocker logs -t --since="2021-05-18T13:23:37" --until "2021-05-19T12:23:37" 容器ID或者容器名称

查看最近10分钟的日志


docker logs --since 10m 容器ID或者容器名称

查看某时间之后的日志


docker logs -t --since="2021-05-18T13:23:37" 容器ID或者容器名称



转载请注明:清风亦平凡 » docker查看日志

]]>
https://www.mlplus.net/2021/05/19/docker-log-view/feed/ 0
Docker容器在Centos使用脚本查看日志与清理 https://www.mlplus.net/2021/04/10/dockercentoslogclear/ https://www.mlplus.net/2021/04/10/dockercentoslogclear/#respond Sat, 10 Apr 2021 05:04:36 +0000 https://www.mlplus.net/?p=3425 背景

jenkins突然无法自动构建镜像,经过确认并非是无法构建,而是磁盘空间满了。 关于手动清理Docker日志的方法,自己曾经也处理过,但是容器多起来就相当麻烦。

linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以json.log结尾的文件.

查看


#!/bin/sh
echo "======== docker containers logs file size ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
ls -lh $log
done
Docker容器在Centos使用脚本查看日志与清理-第0张图片

清理


#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"

限制Docker容器日志大小

全局设置

新建/etc/docker/daemon.json,若是存在编辑即可。添加log-dirverlog-opts参数,示例如下:


# vim /etc/docker/daemon.json
{
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}

max-size设置日志文件的大小的上线,max-file一个容器有多少个日志。

设置的日志大小,只对新建的容器有效.

// 重启docker守护进程
systemctl daemon-reload
systemctl restart docker

单个容器设置

通过配置容器docker-composemax-size选项来实现。


  consul-server-bootstrap:
    container_name: consul-server-bootstrap
    image: consul:latest
    logging: 
      driver: “json-file” 
      options: 
        max-size: “5g”

重新使用docker-compose运行即可完成最后设置。



转载请注明:清风亦平凡 » Docker容器在Centos使用脚本查看日志与清理

]]>
https://www.mlplus.net/2021/04/10/dockercentoslogclear/feed/ 0
删除Docker中为none的Image/镜像 https://www.mlplus.net/2021/04/08/dockernoneimagermove/ https://www.mlplus.net/2021/04/08/dockernoneimagermove/#respond Thu, 08 Apr 2021 15:26:45 +0000 https://www.mlplus.net/?p=3422 docker build 或是 pull 命令就会产生临时镜像。


//删除无效的临时镜像
docker rmi $(docker images -f "dangling=true" -q)
删除Docker中为none的Image/镜像-第0张图片

其他方法

停止容器


docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

删除容器


docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

删除镜像


docker rmi $(docker images | grep "none" | awk '{print $3}')



转载请注明:清风亦平凡 » 删除Docker中为none的Image/镜像

]]>
https://www.mlplus.net/2021/04/08/dockernoneimagermove/feed/ 0
推送Docker镜像被拒绝问题处理 https://www.mlplus.net/2020/09/04/docker-push-denied/ https://www.mlplus.net/2020/09/04/docker-push-denied/#respond Thu, 03 Sep 2020 16:00:00 +0000 https://www.mlplus.net/?p=3178 构建了自己常用的基础镜像,就打算推送到Docker Hub上。首先使用docker login 进行登录,然后就使用docker push 执行镜像推送,最后返回错误信息如下:

denied: requested access to the resource is denied

如下图:

推送Docker镜像被拒绝问题处理-第0张图片

在网上找了下相关信息,大部分都是说认证、登录等信息,按照相关信息试一试也没有什么用。最后发现是镜像名称不符合Docker规范,从而导致了镜像推送被拒绝。

推送的镜像命名规范如下:

登录名/镜像名称:标签

例如:

skyfinder/microsoft-dotnet-2.1-aspnetcore-runtime-libgdiplus:latest

如果现有的镜像名称不符合规范,可以使用tag打一个标签,如下:

docker tag skyfinder/microsoft/dotnet-2.1-aspnetcore-runtime-libgdiplus:1.0 skyfinder/microsoft-dotnet-2.1-aspnetcore-runtime-libgdiplus:latest

当镜像名称符合规范后,就可以使用docker push 来完成推送,如下:

docker push skyfinder/microsoft-dotnet-2.1-aspnetcore-runtime-libgdiplus:latest

至此也不会再有关于文章开头所描述的错误。



转载请注明:清风亦平凡 » 推送Docker镜像被拒绝问题处理

]]>
https://www.mlplus.net/2020/09/04/docker-push-denied/feed/ 0
Docker容器使用gzip压缩保存/加载镜像 https://www.mlplus.net/2020/07/16/dockergzipsaveload/ https://www.mlplus.net/2020/07/16/dockergzipsaveload/#respond Thu, 16 Jul 2020 10:51:08 +0000 https://www.mlplus.net/?p=3009 保存镜像
docker save <myimagename>:<tag> | gzip > <myimagename>_<tag>.tar.gz

加载镜像

gunzip -c <myimagename>_<tag>.tar.gz | docker load



转载请注明:清风亦平凡 » Docker容器使用gzip压缩保存/加载镜像

]]>
https://www.mlplus.net/2020/07/16/dockergzipsaveload/feed/ 0
在Docker中获取Windows MobyLinuxVM 的Shell https://www.mlplus.net/2019/08/23/windowsmobylinuxvmshell/ https://www.mlplus.net/2019/08/23/windowsmobylinuxvmshell/#respond Fri, 23 Aug 2019 08:00:02 +0000 https://www.mlplus.net/?p=1770 使用Docker for Windows时,我们实际上正在使用在特殊Hyper-V VM中运行的小型(自定义)LinuxKit Linux。使用了相当多的方式使在Windows中使用Docker更加便利,似乎容易让人忘记它还在在Linux内核上运行。

请注意,这是关于默认的“Linux容器”模式。它不适用于“Windows容器”模式。

这只是一个可以访问Linux VM的容器,因此您可以执行诸如ps aux查看在VM中运行的守护程序之类的操作。这不是一个完整的操作系统。

首先需要创建一个具有完全root访问权限的容器,然后从那里访问文件系统。

  • 获取可访问Docker守护程序的容器
  • 运行具有完全root访问权限的容器
  • 切换到主机文件系统

构建镜像

使用Docker构建一个镜像,Dockerfile如下所示:


FROM  ubuntu
RUN set -xe \
                && echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
        && echo 'exit 101' >> /usr/sbin/policy-rc.d \
        && chmod +x /usr/sbin/policy-rc.d \
                && dpkg-divert --local --rename --add /sbin/initctl \
        && cp -a /usr/sbin/policy-rc.d /sbin/initctl \
        && sed -i 's/^exit.*/exit 0/' /sbin/initctl \
                && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
                && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
        && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
        && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
                && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
                && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
                && echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
RUN rm -rf /var/lib/apt/lists/*
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container
CMD ["/bin/bash"]
RUN apt-get update && \
    apt-get install -y --no-install-recommends apt-utils docker.io

通过以上 Dockerfile来构建一个镜像

docker build -t skyfinder/accessdockerdesktopvm:v1 .
在Docker中获取Windows MobyLinuxVM 的Shell-第0张图片

镜像构建完成以后依次执行以下操作:

docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock skyfinder/accessdockerdesktopvm:v1 
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
chroot /host
在Docker中获取Windows MobyLinuxVM 的Shell-第1张图片
以上处理方式仅仅运行查看MobyLinuxVM中的信息内容。



转载请注明:清风亦平凡 » 在Docker中获取Windows MobyLinuxVM 的Shell

]]>
https://www.mlplus.net/2019/08/23/windowsmobylinuxvmshell/feed/ 0
Docker容器日志清理 https://www.mlplus.net/2019/01/07/dockerlogsclear/ https://www.mlplus.net/2019/01/07/dockerlogsclear/#respond Mon, 07 Jan 2019 01:00:24 +0000 https://www.mlplus.net/?p=1307 Docker会将容器应用标准化输出的内容做为日志进行记录,并永久保存在磁盘上。久而久之容器日志占用磁盘空间就越来越大。使用以下命令可以查看指定容器日志,如下:

docker logs -f containerId

日志位置

对应的Docker容器的日志位置一般如下:

/var/lib/docker/containers/containerid/containerid-json.log

containerid是指应用容器的id

通过以下命令确定要清理日志的容器id,如下:

#查找正在运行的容器列表

docker ps

#根据容器列表的CONTAINER ID 来查找完整的容器id

docker inspect containerid

查找容器id
查找容器id

日志清理

cat /dev/null >/var/lib/docker/containers/containerid/containerid-json.log



转载请注明:清风亦平凡 » Docker容器日志清理

]]>
https://www.mlplus.net/2019/01/07/dockerlogsclear/feed/ 0
Docker 入门教程 https://www.mlplus.net/2018/12/22/dockerbaseresources/ https://www.mlplus.net/2018/12/22/dockerbaseresources/#respond Sat, 22 Dec 2018 01:16:55 +0000 https://www.mlplus.net/?p=1152 2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发。

docker iamge

一、环境配置的难题

软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:”它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

二、虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

(1)资源占用多

虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

(2)冗余步骤多

虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

(3)启动慢

启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

三、Linux 容器

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

四、Docker 是什么?

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

五、Docker 的用途

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

六、Docker 的安装

Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。

Docker CE 的安装请参考官方文档。

安装完成后,运行下面的命令,验证是否安装成功。

$ docker version
或者
$ docker info

Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组(官方文档)。

sudo usermod -aG docker $USER

Docker 是服务器—-客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动(官方文档)。

#service 命令的用法
 sudo service docker start
#systemctl 命令的用法
 sudo systemctl start docker

六、image 文件

Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。

#列出本机的所有 image 文件。
 docker image ls
#删除 image 文件
 docker image rm [imageName]

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。

七、实例:hello world

下面,我们通过最简单的 image 文件”hello world”,感受一下 Docker。

需要说明的是,国内连接 Docker 的官方仓库很慢,还会断线,需要将默认仓库改成国内的镜像网站,具体的修改方法在下一篇文章的第一节。有需要的朋友,可以先看一下。

首先,运行下面的命令,将 image 文件从仓库抓取到本地。

docker image pull library/hello-world

上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。

由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。

docker image pull hello-world

抓取成功以后,就可以在本机看到这个 image 文件了。

docker image ls

现在,运行这个 image 文件。

docker container run hello-world

docker container run命令会从 image 文件,生成一个正在运行的容器实例。

注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。

如果运行成功,你会在屏幕上读到下面的输出。

docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

……

hello  world  image

 hello-world执行后输出信息

输出这段提示以后,hello world就会停止运行,容器自动终止。

有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。

docker container run -it ubuntu bash

对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。

docker container kill [containID]

八、容器文件

image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

#列出本机正在运行的容器
 docker container ls
#列出本机所有容器,包括终止运行的容器
 docker container ls –all

上面命令的输出结果之中,包括容器的 ID。很多地方都需要提供这个 ID,比如上一节终止容器运行的docker container kill命令。

终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm命令删除。

docker container rm [containerID]

运行上面的命令之后,再使用docker container ls –all命令,就会发现被删除的容器文件已经消失了。

九、Dockerfile 文件

学会使用 image 文件以后,接下来的问题就是,如何可以生成 image 文件?如果你要推广自己的软件,势必要自己制作 image 文件。

这就需要用到 Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。

下面通过一个实例,演示如何编写 Dockerfile 文件。

十、实例:制作自己的 Docker 容器

下面我以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。

作为准备工作,请先下载源码。

git clone https://github.com/ruanyf/koa-demos.git
cd koa-demos

编写 Dockerfile 文件

首先,在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容

.git
node_modules
npm-debug.log

上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。

然后,在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容。

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install –registry=https://registry.npm.taobao.org
EXPOSE 3000

上面代码一共五行,含义如下。

  • FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
  • COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
  • WORKDIR /app:指定接下来的工作路径为/app。
  • RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
  • EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。

创建 image 文件

有了 Dockerfile 文件以后,就可以使用docker image build命令创建 image 文件了。

 docker image build -t koa-demo .
或者
docker image build -t koa-demo:0.0.1 .

上面代码中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

如果运行成功,就可以看到新生成的 image 文件koa-demo了。

docker image ls

生成容器

docker container run命令会从 image 文件生成容器。

docker container run -p 8000:3000 -it koa-demo /bin/bash
或者
docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

上面命令的各个参数含义如下:

  • -p参数:容器的 3000 端口映射到本机的 8000 端口。
  • -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
  • koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
  • /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。

如果一切正常,运行上面的命令以后,就会返回一个命令行提示符。

root@66d80f4aaf1e:/app#

这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。执行下面的命令。

root@66d80f4aaf1e:/app# node demos/01.js

这时,Koa 框架已经运行起来了。打开本机的浏览器,访问 http://127.0.0.1:8000,网页显示”Not Found”,这是因为这个 demo 没有写路由。

这个例子中,Node 进程运行在 Docker 容器的虚拟环境里面,进程接触到的文件系统和网络接口都是虚拟的,与本机的文件系统和网络接口是隔离的,因此需要定义容器与物理机的端口映射(map)。

现在,在容器的命令行,按下 Ctrl + c 停止 Node 进程,然后按下 Ctrl + d (或者输入 exit)退出容器。此外,也可以用docker container kill终止容器运行。

#在本机的另一个终端窗口,查出容器的 ID
 docker container ls
#停止指定的容器运行
 docker container kill [containerID]

容器停止运行之后,并不会消失,用下面的命令删除容器文件。

#查出容器的 ID
 docker container ls –all
#删除指定的容器文件
 docker container rm [containerID]

也可以使用docker container run命令的–rm参数,在容器终止运行后自动删除容器文件。

docker container run –rm -p 8000:3000 -it koa-demo /bin/bash

CMD 命令

上一节的例子里面,容器启动以后,需要手动输入命令node demos/01.js。我们可以把这个命令写在 Dockerfile 里面,这样容器启动以后,这个命令就已经执行了,不用再手动输入了。

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install –registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js

上面的 Dockerfile 里面,多了最后一行CMD node demos/01.js,它表示容器启动后自动执行node demos/01.js。

你可能会问,RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。现在,启动容器可以使用下面的命令。

docker container run –rm -p 8000:3000 -it koa-demo:0.0.1

发布 image 文件

容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。

首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。

docker login

接着,为本地的 image 标注用户名和版本。

docker image tag [imageName] [username]/[repository]:[tag]
#实例
docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

也可以不标注用户名,重新构建一下 image 文件。

docker image build -t [username]/[repository]:[tag]

最后,发布 image 文件。

docker image push [username]/[repository]:[tag]

发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。

十一、其他有用的命令

docker 的主要用法就是上面这些,此外还有几个命令,也非常有用。

(1)docker container start

前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。

docker container start [containerID]

(2)docker container stop

前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。

bash container stop [containerID]

这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。

(3)docker container logs

docker container logs命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。

docker container logs [containerID]

(4)docker container exec

docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。

docker container exec -it [containerID] /bin/bash

(5)docker container cp

docker container cp命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。

docker container cp [containID]:[/path/to/file]

非常感谢你一直读到了这里,这个系列还有下一篇,介绍如何使用 Docker 搭建真正的网站,欢迎继续阅读。

(完)

原作者:阮一峰

原链接:http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html



转载请注明:清风亦平凡 » Docker 入门教程

]]>
https://www.mlplus.net/2018/12/22/dockerbaseresources/feed/ 0
CentOS 安装 Docker 应用容器引擎 https://www.mlplus.net/2018/12/20/centosinstalldockerapp/ https://www.mlplus.net/2018/12/20/centosinstalldockerapp/#respond Thu, 20 Dec 2018 01:10:01 +0000 https://www.mlplus.net/?p=1145 Docker支持以下的CentOS版本:

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

CentOS 安装Docker的必要条件

目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

使用 yum 安装(CentOS 7)

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本

uname -r

CentOS  安装 Docker 应用容器引擎-第0张图片

安装 Docker

从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。本文用到的 Docker CE 的安装使用。移除旧的版本:

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

安装一些必要的系统依赖包:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加yum国内的软件源

建议添加国内的源,国内源速度上有巨大的优势.
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

以上命令会添加稳定版本的 Docker CE yum 源。从 Docker 17.06 开始,edge test 版本的 yum 源也会包含稳定版本的 Docker CE。

添加yum官方的软件源

如果已经使用了国内的软件源,就不必再使用官方的源。官方的相比国内的速度上存在差异。官方源要慢很多。
sudo yum-config-manager \
 --add-repo \
 https://download.docker.com/linux/centos/docker-ce.repo

更新 yum 缓存:

sudo yum makecache fast

安装 Docker-ce:

sudo yum -y install docker-ce

启动 Docker 后台服务

sudo systemctl enable docker
sudo systemctl start docker

测试 Docker 是否安装正确

docker run hello-world

docker run hello-world
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。若能正常输出以上信息,则说明安装成功。

使用脚本安装 Docker

  • 使用 sudo 或 root 权限登录 Centos。
  • 确保 yum 包更新到最新。
  • 执行 Docker 安装脚本
  • 启动 Docker 进程。

sudo yum update

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable docker
sudo systemctl start docker

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组

sudo groupadd docker

将当前用户加入 docker 组:

sudo usermod -aG docker $USER

镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的阿里云的镜像地址:https://1x95ncoz.mirror.aliyuncs.com。
新版的 Docker 使用 /etc/docker/daemon.json来配置 Daemon。请在该配置文件中加入(没有该文件的话,请先建一个):

{
“registry-mirrors”: [“https://1x95ncoz.mirror.aliyuncs.com”]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动

添加完成之后需重新启动服务

sudo systemctl daemon-reload
sudo systemctl restart docker

删除 Docker CE

执行以下命令来删除 Docker CE:

sudo yum remove docker-ce
sudo rm -rf /var/lib/docker

       

          



转载请注明:清风亦平凡 » CentOS 安装 Docker 应用容器引擎

]]>
https://www.mlplus.net/2018/12/20/centosinstalldockerapp/feed/ 0
解决CentOS系统下docker info 出现的警告 https://www.mlplus.net/2018/12/18/centosdockerinfowarning/ https://www.mlplus.net/2018/12/18/centosdockerinfowarning/#respond Tue, 18 Dec 2018 01:00:56 +0000 https://www.mlplus.net/?p=1133 CentOS系统下执行docker info后出现两条警告, 如下:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

如下图:

解决CentOS系统下docker info 出现的警告-第0张图片

解决办法,编辑:/etc/sysctl.conf  并添加如下内容:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

编辑保存之后,执行如下内容:

sysctl -p

完成之后,再次使用docker info进行查看就发现已经没有这两条警告了,这样此问题就解决了!这里做个记录吧!!!



转载请注明:清风亦平凡 » 解决CentOS系统下docker info 出现的警告

]]>
https://www.mlplus.net/2018/12/18/centosdockerinfowarning/feed/ 0
docker容器与Linux主机环境获取时间不一致 https://www.mlplus.net/2018/12/14/dockerandhostdatetimenotsame/ https://www.mlplus.net/2018/12/14/dockerandhostdatetimenotsame/#comments Fri, 14 Dec 2018 01:13:36 +0000 https://www.mlplus.net/?p=1060 最近使用.net core写了一个简单的网站存活监测小程序,每十分钟进行一次检测,如果异常或者网站无法访问就通过腾讯云短信服务进行通知。在Windows 和 Linux 系统中运行均正常,但放到Linux系统下Docker环境中,获取到的时间就慢8个小时,默认似乎不是东八区了。记得之前也遇到过这个问题,使用了一个.net Core类库(NodaTime)解决的,详情请见:.net Core 中DateTime在Linux Docker中与Windows时间不一致 。但是这次不想用多余的类库来解决,所以通过同步时间来解决。

共享主机的localtime

创建容器的时候指定启动参数,挂载localtime文件到容器内 ,保证两者所采用的时区是一致的。

 docker run --name qq -v /etc/localtime:/etc/localtime -d dotnetcoreqqcloudsms

复制主机的localtime

docker cp /etc/localtime containerid:/etc/localtime

创建自定义的dockerfile

在原本dockerfile文件中新增以下内容


#时区设置
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo ‘Asia/Shanghai’ >/etc/timezone

dockerfile全部内容如下


FROM microsoft/dotnet:2.0-runtime AS base
WORKDIR /DotnetCoreQQCloudSms
COPY . /DotnetCoreQQCloudSms
#时区设置
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo ‘Asia/Shanghai’ >/etc/timezone

ENTRYPOINT ["dotnet", "DotnetCoreQQCloudSms.dll"]

保存后重新构建镜像运行即可。

docker容器与Linux主机环境获取时间不一致-第0张图片

.Net6使用以上时区设置无效

使用以上Dockerfile时区设置,容器内部日期已经正常,但是.NET6应用获取的日期还是存在问题,没有任何效果。

Linux日期Docker中显示异常

修改原有Dockerfile时区设置,添加如下内容


#时区设置
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo ‘Asia/Shanghai’ >/etc/timezone \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

修改后Dockerfile全部内容示例如下


FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
#时区设置
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo ‘Asia/Shanghai’ >/etc/timezone \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
WORKDIR /app
COPY .  /app/
ENTRYPOINT ["dotnet", "JustHost.Ftp.ClearLog.dll"]
Net6中Docker日期显示问题处理

经过测试确认问题已经解决,需要注意一下时区设置并不需要这么多内容,只需要如下内容即可


#时区设置
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

简化后的Dockerfile全部内容示例如下


FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
#时区设置
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
WORKDIR /app
COPY .  /app/
ENTRYPOINT ["dotnet", "JustHost.Ftp.ClearLog.dll"]



转载请注明:清风亦平凡 » docker容器与Linux主机环境获取时间不一致

]]>
https://www.mlplus.net/2018/12/14/dockerandhostdatetimenotsame/feed/ 2
Docker for Windows 更改磁盘镜像位置 https://www.mlplus.net/2018/12/08/dockerforwindowschangediskimagelocation/ https://www.mlplus.net/2018/12/08/dockerforwindowschangediskimagelocation/#respond Sat, 08 Dec 2018 01:09:26 +0000 http://www.skyfinder.cc/?p=987 相关问题

在windows10下安装docker for windows,随着用docker pull image文件后,虚拟机的镜像越来越大,但C盘的容量越来越小了,于是就想修改下相关路径到其他盘符。

原因分析

windows上安装的docker其实本质上还是借助与windows平台的hyper-v技术来创建一个linux虚拟机(默认使用的镜像是MobyLinuxVM),你执行的所有命令其实都是在这个虚拟机里执行的,所以所有pull到本地的image都会在虚拟机的Virtual hard disks目录的文件中,这个文件就是虚拟硬盘文件。如果要想改变路径只需要在hyper-v管理器里设置就可以了。默认的安装路径是C:\Users\Public\Documents\Hyper-V\Virtual hard disks下。

解决方案

一、当你的刚刚安装docker for windows后或者你的镜像不大且接受重新创建虚拟机的情况下,可以使用以下方法。

  • 退出docker for windows服务Docker for Windows 更改磁盘镜像位置-第0张图片
  • 启动hyper-v管理器
    -MobyLinuxVM虚拟机-右键->设置->硬盘启动区,查看虚拟硬盘的位置,一般是C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\MobyLinuxVM.vhdx。这里看看镜像在哪里,路径先复制下来,然后关掉不用其他操作。Docker for Windows 更改磁盘镜像位置-第1张图片Docker for Windows 更改磁盘镜像位置-第2张图片
  • 指定hyper-v虚拟硬盘默认存储位置和存储虚拟机配置文件的文件夹。应用并确定。Docker for Windows 更改磁盘镜像位置-第3张图片Docker for Windows 更改磁盘镜像位置-第4张图片
  • 重启docker for windows 服务。等docker for windows运行后就完成了操作。就实现了更改位置。但是这里里面的虚拟机是默认的,里面是没有docker镜像文件的,自己要重新docker pull  名称:标签。在第二步记录的那个原来虚拟机的镜像路径,现在可以删除了。

二、如果你的虚拟机镜像已经很大并不想放弃原有内容,则可以使用以下方法

  • 退出docker for windows服务Docker for Windows 更改磁盘镜像位置-第0张图片
  • 指定hyper-v虚拟硬盘默认存储位置和存储虚拟机配置文件的文件夹。应用并确定。Docker for Windows 更改磁盘镜像位置-第3张图片Docker for Windows 更改磁盘镜像位置-第4张图片
  • 选中MobyLinuxVM虚拟机并右键选择移动。根据提示一步一步进行选择,最后点击完成。等待一小会就完成了Docker for Windows 更改磁盘镜像位置-第8张图片Docker for Windows 更改磁盘镜像位置-第9张图片Docker for Windows 更改磁盘镜像位置-第10张图片Docker for Windows 更改磁盘镜像位置-第11张图片Docker for Windows 更改磁盘镜像位置-第12张图片Docker for Windows 更改磁盘镜像位置-第13张图片
  • 重启docker for windows 服务

以上就完成了Docker for Windows磁盘镜像位置的更改,之前看到网上有通过Docker for Window中的Settings下的Advanced进行更改镜像位置的。这个方法我最初也使用过,结果还是以失败而告终。如下(未能修改成功):

Docker for Windows 更改磁盘镜像位置-第14张图片

Docker for Windows 更改磁盘镜像位置-第15张图片

 

转载请注明:清风亦平凡 » Docker for Windows 更改磁盘镜像位置

]]>
https://www.mlplus.net/2018/12/08/dockerforwindowschangediskimagelocation/feed/ 0
Docker for Windows 设置的Shared Drives 设置不生效 https://www.mlplus.net/2018/12/07/dockerforwindowsshareddrivesinvalid/ https://www.mlplus.net/2018/12/07/dockerforwindowsshareddrivesinvalid/#respond Fri, 07 Dec 2018 03:43:48 +0000 http://www.skyfinder.cc/?p=983 Docker中的settings里的Shared Drives 选择对应盘符后,点击Apply后无法生效。试了两遍都不行,这是有问题的 。

Docker for Windows 设置的Shared Drives 设置不生效-第0张图片

解决办法

win+R ,键入gpedit.msc,出现如下界面,找到高亮处的网络访问:本地账户的共享和安全模型,选择如图中的 经典 选项

Docker for Windows 设置的Shared Drives 设置不生效-第1张图片

 

 

 

转载请注明:清风亦平凡 » Docker for Windows 设置的Shared Drives 设置不生效

]]>
https://www.mlplus.net/2018/12/07/dockerforwindowsshareddrivesinvalid/feed/ 0
如何浏览/启动/停止/删除 docker 容器 https://www.mlplus.net/2018/11/16/liststartstopdeldockercontainers/ https://www.mlplus.net/2018/11/16/liststartstopdeldockercontainers/#respond Fri, 16 Nov 2018 01:00:02 +0000 http://www.skyfinder.cc/?p=614 什么是 Docker 容器

正在运行的镜像(Image)实例称为容器。 Docker使用Docker镜像作为只读模板来进行启动。 如果您启动镜像,则表示您拥有此镜像的运行容器。 当然,您可以拥有许多相同镜像的运行容器。 我们使用命令“docker run”来运行docker容器。

查看Docker容器列表

要查看容器,请运行以下命令:

docker ps [ OPTIONS ]

要列出正在运行和已停止的容器,请使用-a选项,如下所示:

docker ps -a

如何浏览/启动/停止/删除 docker 容器-第0张图片

CONTAINER ID –容器的唯一ID

IMAGE   –已启动容器的基本映像

COMMAND –启动容器时使用的命令

CREATED  –创建容器的时间

STATUS  –容器的当前状态(Up或Exited)

PORTS –端口号(如果有),转发到docker主机以与外部世界通信

NAMES -Dockers守护程序以一种有趣的方式命名集群。您也可以在生成容器时指定自己的名称。

若要只列出容器 id, 请使用-aq 选项。

docker ps -qa

如何浏览/启动/停止/删除 docker 容器-第1张图片

列出最后创建的容器 (正在运行或停止):

docker ps -l

如何浏览/启动/停止/删除 docker 容器-第2张图片

启动Docker容器

使用以下命令启动Docker容器:

docker run [ OPTIONS ] IMAGE[:TAG] [COMMAND] [ARG…]

例如 :

docker run -i -t –name=hello hello-world /hello

如何浏览/启动/停止/删除 docker 容器-第3张图片

-i :以交互模式启动容器。

-t :让docker分配一个伪终端并绑定到容器的标准输入

–name : 指定容器的友好名称。 如果未指定名称,则将随机字符串指定为容器名称。

当您使用-t运行docker命令时,您将立即附加到容器,并会看到命令提示符已更改。 您可以使用命令“exit”退出容器。

当您运行“docker run”命令并且系统上本地没有指定iamge时,它将首先使用“docker search”和“docker pull”命令下载,然后再运行“docker run”命令。

在上面的所有示例中,当您启动容器时,您将自动登录到该容器。 当您退出容器时,容器将停止。 在使用-d可以使容器保持后台运行。 例如 :

如何浏览/启动/停止/删除 docker 容器-第4张图片

-d  在后台运行容器并输出容器ID

停止Docker容器

您可以一次停止一个或多个(所有)容器。 停止docker容器的命令的语法是:

docker stop [-t|–time[=10]] CONTAINER [CONTAINER…]

–time/-t  是在停止容器之前要等待的时间

例如,首先显示正在运行的容器。

docker ps -q

现在使用下面的命令停止上面的容器。

docker stop 908f3acf2a64

如何浏览/启动/停止/删除 docker 容器-第5张图片

要停止所有容器,请运行以下命令:

docker stop ‘docker ps -q’

删除Docker容器

要删除docker容器,请使用以下语法:

docker rm [ OPTIONS ] CONTAINER [ CONTAINER ]

例如:

docker rm 908f3acf2a64

如何浏览/启动/停止/删除 docker 容器-第6张图片

要删除指定容器,我们需要先停止它。 例如,如果您尝试删除正在运行的容器,则会看到以下错误:

docker rm 9742875991f1
Error response from daemon: You cannot remove a running container 9742875991f18d54b13311fac48e790633d7ea0601e1d4e3e3ebac0fd02f80c3. Stop the container before attempting removal or force remove

因此,要删除容器,请先将其停止然后将其删除。

docker stop 9742875991f1

docker rm 9742875991f1

要在不停止容器的情况下强制删除容器,请使用-f选项。

docker rm -f 9742875991f1

要一次删除所有容器,首先将它们全部停止,然后再删除它们。

docker stop ‘docker ps -q’
docker rm ‘docker ps -aq’

 

 

 

转载请注明:清风亦平凡 » 如何浏览/启动/停止/删除 docker 容器

]]>
https://www.mlplus.net/2018/11/16/liststartstopdeldockercontainers/feed/ 0
Linux系统安装docker-compose https://www.mlplus.net/2018/10/19/installdockercompose/ https://www.mlplus.net/2018/10/19/installdockercompose/#respond Fri, 19 Oct 2018 04:20:04 +0000 http://www.skyfinder.cc/?p=616 一、下载docker-compose文件 

curl -L https://github.com/docker/compose/releases/download/1.23.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

二、添加可执行权限 

chmod +x /usr/local/bin/docker-compose

三、测试安装结果,查看版本。

docker-compose –version



转载请注明:清风亦平凡 » Linux系统安装docker-compose

]]>
https://www.mlplus.net/2018/10/19/installdockercompose/feed/ 0
docker启动,重启,关闭命令 https://www.mlplus.net/2018/10/18/dockerrestartrunclose/ https://www.mlplus.net/2018/10/18/dockerrestartrunclose/#respond Thu, 18 Oct 2018 04:20:21 +0000 http://www.skyfinder.cc/?p=612 docker启动命令,docker重启命令,docker关闭命令

启动

     systemctl start docker

守护进程重启

 sudo systemctl daemon-reload

查看docker运行状态

sudo service docker status

 

重启docker服务

 systemctl restart docker

sudo service docker restart

关闭docker

service docker stop

systemctl stop docker

 

 

 

转载请注明:清风亦平凡 » docker启动,重启,关闭命令

]]>
https://www.mlplus.net/2018/10/18/dockerrestartrunclose/feed/ 0
使用Docker-compose构建容器 https://www.mlplus.net/2018/10/17/dockercomposebuild/ https://www.mlplus.net/2018/10/17/dockercomposebuild/#respond Wed, 17 Oct 2018 04:20:40 +0000 http://www.skyfinder.cc/?p=605 Docker Compose 是一个用来定义和运行复杂应用的 Docker 工具,以 yaml 格式的数据来保存容器配置,使用更简单的命令完成对容器的管理。此外 docker-compose.yml 还起到一个说明文档的作用, 一切配置在里面显得一目了然,就不用另外单独写部署文档了。

1. 安装 Docker Compose


# curl方式安装(推荐)
# 如果权限不够,先执行 sudo -i 切换到root帐号
curl -L https://get.daocloud.io/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /tmp/docker-compose
chmod +x /tmp/docker-compose
sudo mv /tmp/docker-compose /usr/local/bin/docker-compose

# pip方式安装(需要python,[pip安装方法])
sudo pip install docker-compose

2. 卸载 Docker Compose

# 对于curl安装方式
sudo rm /usr/local/bin/docker-compose

# 对于pip安装方式
pip uninstall docker-compose

使用方法

docker-compose [选项] [子命令]

命令选项列表

选项 说明
-f 指定配置文件, 默认为 ./docker-compose.yml
-p 设置项目名, 默认为配置文件上级目录名
–verbose 输出详细信息
-H 指定docker服务器, 相当于 docker -H

子命令列表

子命令 说明
build 构建或重建服务依赖的镜像(配置文件指定build而不是image)
config 校验文件并显示解析后的配置
images 列出容器使用的镜像
events 监控服务下容器的事件
logs 显示容器的输出内容 相当于 docker logs
port 打印绑定的开放端口
ps 显示当前项目下的容器,加-p参数指定项目名 相当于 docker ps
help 命令帮助
pull 拉取服务用到的镜像 相当于 docker pull
up 项目下创建服务并启动容器,如果指定了项目名,

其他操作也要带上项目名参数。容器名格式:[项目名]\_[服务名]\_[序号]

down 移除 up 命令创建的容器、网络、挂载点、镜像
pause 暂停服务下所的容器
unpause 恢复服务下所有暂停的容器
rm 删除服务下停止的容器
exec 在服务下启动的容器中运行命令 相当于 docker exec,
run 服务下创建并运行容器 相当于 docker run ,与 up 命令的区别在于端口要另外映射

,且不受start/stop/restart/kill等命令影响,容器名格式:[项目名]\_[服务名]\_run\_[序号]

scale 设置服务的容器数目,多增少删
start 开启服务(up命令创建的所有容器) 相当于 docker start
stop 停止服务(up命令创建的所有容器) 相当于 docker stop
restart 重启服务(up命令创建的所有容器) 相当于 docker restart
kill 像服务发送信号(up命令创建的所有容器) 相当于 docker kill

 

 

 

 

 

转载请注明:清风亦平凡 » 使用Docker-compose构建容器

]]>
https://www.mlplus.net/2018/10/17/dockercomposebuild/feed/ 0
如何使用Dockerfile来构建镜像 https://www.mlplus.net/2018/10/16/dockerfordockerfile/ https://www.mlplus.net/2018/10/16/dockerfordockerfile/#respond Tue, 16 Oct 2018 04:12:00 +0000 http://www.skyfinder.cc/?p=603 使用Dockerfile来构建镜像。

用法说明

选项 用法 说明
FROM FROM <image>:<tag> 指定基础镜像
MAINTAINER MAINTAINER <name> <email> 创建者信息
RUN RUN <command> 执行容器操作,主要用来安装软件
CMD CMD [“executable”,”param1″,”param2″]

CMD command param1 param2

CMD [“param1″,”param2”]

镜像启动时的操作,会被容器的启动命令覆盖。

指定多次则最后一条生效

ENTRYPOINT CMD,与CMD差别主要

在于其在容器启动时不会被覆盖

启动容器执行的命令,CMD可为其提供参数。

指定多次则最后一条生效,

如果之后的CMD是完整指令则会被其覆盖。

USER USER daemon 指定容器的用户,默认为 root
EXPOSE EXPOSE <port> <port> … 暴露容器端口
ENV ENV <key> <value> 设置容器内环境变量
COPY COPY <src> <dest> 从宿主机拷贝内容到容器内,/结尾表示目录
ADD ADD <src> <dest> 高级版的COPY,如果 <src> 为url则表示下载文件,

如果 <src> 为可识别的压缩文件,拷贝后会进行解压。

建议最好还是用COPY

VOLUME VOLUME [“<mountpoint>”] 指定挂载点,对应目录会映射到宿主机的目录上,

宿主机对应的目录是自动生成的无法指定

WORKDIR WORKDIR <path> 切换容器内目录,相当于cd

在 Dockerfile 中,每一条指令( RUN 、ADD 、COPY 等)都会创建一个镜像层,相对的,层数变多就会增加镜像的大小,需要注意在后面的镜像层中删除文件并不会减小镜像大小。所以最好将多条指令合并执行再跟上删除操作,以此来精简镜像大小。

 

 

 

 

转载请注明:清风亦平凡 » 如何使用Dockerfile来构建镜像

]]>
https://www.mlplus.net/2018/10/16/dockerfordockerfile/feed/ 0
Docker 常用指令详解 https://www.mlplus.net/2018/10/15/dockercommondcommonlyused/ https://www.mlplus.net/2018/10/15/dockercommondcommonlyused/#respond Mon, 15 Oct 2018 01:00:47 +0000 http://www.skyfinder.cc/?p=600 docker 分为客户端和服务端两部分, docker 为客户端调用的命令, dockerd 为服务端调用的命令, 本文着重介绍客户端的用法。

主要用法:docker [ docker命令选项 ] [ 子命令 ] [ 子命令选项 ]

docker [ 子命令 ] –help 可查看每个子命令的详细用法。

docker命令选项列表

选项 说明 其他
–config [string] 客户端本地配置文件路径 默认为 ~/.docker
-D, –debug 启用调试模式
–help 打印用法
-H, –host list 通过socket访问指定的docker守护进程(服务端) unix:// , fd:// , tcp://
-l, –log-level [string] 设置日志级别 (debuginfowarnerrorfatal) 默认为 info
–tls 启用TLS加密
–tlscacert [string] 指定信任的CA根证书路径 默认为 ~/.docker/ca.pem
–tlscert [string] 客户端证书路径 默认为 ~/.docker/cert.pem
–tlskey [string] 客户端证书私钥路径 默认为 ~/.docker/key.pem
–tlsverify 启用TLS加密并验证客户端证书
-v, –version 打印docker客户端版本信息

1. 镜像仓库相关

1.1 查找镜像

docker search [条件]

1.2 获取镜像

docker pull [仓库]:[tag]

仓库格式为 [仓库url]/[用户名]/[应用名] , 除了官方仓库外的第三方仓库要指定url, 用户名就是在对应仓库下建立的账户, 一般只有应用名的仓库代表官方镜像, 如 ubuntu、tomcat 等, 而 tag 表示镜像的版本号, 不指定时默认为 latest

1.3 推送镜像到仓库

docker push [镜像名]:[tag]

1.4 登录/退出第三方仓库

docker [login/logout] [仓库地址]

2. 本地镜像

2.1 查看本地镜像

docker images

2.2 删除本地镜像

docker rmi [镜像名 or 镜像id]

如果用镜像id作为参数, 可以只输入前几位, 能唯一确定即可(可以同时删除多个镜像, 空格隔开)。此外, 如果该镜像启动了容器需要先删除容器。

2.3 查看镜像详情

docker inspect [镜像名 or 镜像id]

2.4 打包本地镜像, 使用压缩包来完成迁移

docker save [镜像名] > [文件路径]

2.5 导入镜像压缩包

docker load < [文件路径]

2.6 修改镜像tag

docker tag [镜像名 or 镜像id] [新镜像名]:[新tag]

3. 容器相关

3.1 创建、启动容器并执行相应的命令

docker run [参数] [镜像名 or 镜像id] [命令]

如果没有指定命令是执行镜像默认的命令, 创建镜像的时候可设置。另外要注意的一点, 启动容器后要执行一个前台进程(就是能在控制台不断输出)才能使容器保持运行状态, 否则, 命令执行完容器就关闭了。

run命令常用选项

选项 说明
-d 后台运行容器, 并返回容器ID;不指定时, 启动后开始打印日志, Ctrl + C 退出命令同时会关闭容器
-i 以交互模式运行容器, 通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端, 通常与 -i 同时使用
–name “anyesu-container” 为容器指定一个别名, 不指定时随机生成
-h docker-anyesu 设置容器的主机名, 默认随机生成
–dns 8.8.8.8 指定容器使用的DNS服务器, 默认和宿主一致
-e docker_host=172.17.0.1 设置环境变量
–cpuset=”0-2″ or –cpuset=”0,1,2″ 绑定容器到指定CPU运行
-m 100M 设置容器使用内存最大值
–net bridge 指定容器的网络连接类型, 支持 bridge / host / none / container 四种类型
–ip 172.18.0.13 为容器分配固定ip(需要使用自定义网络)
–expose 8081 –expose 8082 开放一个端口或一组端口, 会覆盖镜像设置中开放的端口
-p [宿主机端口]:[容器内端口] 宿主机到容器的端口映射, 可指定宿主机的要监听的ip, 默认为 0.0.0.0
-P 注意是大写的, 宿主机随机指定一组可用的端口映射容器 expose 的所有端口
-v [宿主机目录路径]:[容器内目录路径] 挂载宿主机的指定目录(或文件)到容器内的指定目录(或文件)
–add-host [主机名]:[ip] 为容器hosts文件追加host, 默认会在hosts文件最后追加 [主机名]:[容器ip]
–volumes-from [其他容器名] 将其他容器的数据卷添加到此容器
–link [其他容器名]:[在该容器中的别名] 添加链接到另一个容器, 在本容器hosts文件中加入关联容器的记录, 效果类似于 --add-host
单字符选项可以合并, 如 -i -t 可以合并为 -it

3.2 查看运行中的容器

docker ps
加 -a 选项可查看所有的容器

3.3 开启/停止/重启容器

# 关闭容器(发送SIGTERM信号,做一些’退出前工作’,再发送SIGKILL信号)
docker stop [容器名 or 容器id]
# 强制关闭容器(默认发送SIGKILL信号, 加-s参数可以发送其他信号)
docker kill [容器名 or 容器id]
# 启动容器
docker start [容器名 or 容器id]
# 重启容器
docker restart [容器名 or 容器id]

3.4 删除容器

docker rm [容器名 or 容器id]

可以指定多个容器一起删除, 加 -f 选项可强制删除正在运行的容器

3.5 查看容器详情

docker inspect [容器名 or 容器id]

3.6 查看容器中正在运行的进程

docker top [容器名 or 容器id]

3.7 将容器保存为镜像

docker commit [容器名 or 容器id] [镜像名]:[tag]

3.8 使用Dockerfile构建镜像

docker build -t [镜像名]:[tag] -f [DockerFile名] [DockerFile所在目录]

4. 硬件资源相关

4.1 显示容器硬件资源使用情况

docker stats [选项] [0个或多个正在运行容器]

4.2 更新容器的硬件资源限制

docker update [选项]

基础子命令列表

选项 说明
attach 进入运行中的容器, 显示该容器的控制台界面。注意, 从该指令退出会导致容器关闭
build 根据 Dockerfile 文件构建镜像
commit 提交容器所做的改为为一个新的镜像
cp 在容器和宿主机之间复制文件
create 根据镜像生成一个新的容器
diff 展示容器相对于构建它的镜像内容所做的改变
events 实时打印服务端执行的事件
exec 在已运行的容器中执行命令
export 导出容器到本地快照文件
history 显示镜像每层的变更内容
images 列出本地所有镜像
import 导入本地容器快照文件为镜像
info 显示 Docker 详细的系统信息
inspect 查看容器或镜像的配置信息, 默认为json数据
kill -s 选项向容器发送信号, 默认为SIGKILL信号(强制关闭)
load 导入镜像压缩包
login 登录第三方仓库
logout 退出第三方仓库
logs 打印容器的控制台输出内容
pause 暂停容器
port 容器端口映射列表
ps 列出正在运行的容器, -a 选项显示所有容器
pull 从镜像仓库拉取镜像
push 将镜像推送到镜像仓库
rename 重命名容器名
restart 重启容器
rm 删除已停止的容器, -f 选项可强制删除正在运行的容器
rmi 删除镜像(必须先删除该镜像构建的所有容器)
run 根据镜像生成并进入一个新的容器
save 打包本地镜像, 使用压缩包来完成迁移
search 查找镜像
start 启动关闭的容器
stats 显示容器对资源的使用情况(内存、CPU、磁盘等)
stop 关闭正在运行的容器
tag 修改镜像tag
top 显示容器中正在运行的进程(相当于容器内执行 ps -ef 命令)
unpause 恢复暂停的容器
update 更新容器的硬件资源限制(内存、CPU等)
version 显示docker客户端和服务端版本信息
wait 阻塞当前命令直到对应的容器被关闭, 容器关闭后打印结束代码
daemon 这个子命令已过期, 将在Docker 17.12之后的版本中移出, 直接使用dockerd

用于管理的子命令列表

选项 说明
container 管理容器
image 管理镜像
network 管理容器网络(默认为bridge、host、none三个网络配置)
plugin 管理插件
system 管理系统资源。其中, docker system prune 命令用于清理没有使用的镜像, 容器, 数据卷以及网络
volume 管理数据卷
swarm 管理Swarm模式
service 管理Swarm模式下的服务
node 管理Swarm模式下的docker集群中的节点
secret 管理Swarm模式下的敏感数据
stack Swarm模式下利用compose-file管理服务

说明

其中 container 、image 、system 一般用前面的简化指令即可。Swarm 模式用来管理docker集群, 它将一群Docker宿主机变成一个单一的虚拟的主机, 实现对多台物理机的集群管理。

转载请注明:清风亦平凡 » Docker 常用指令详解

]]>
https://www.mlplus.net/2018/10/15/dockercommondcommonlyused/feed/ 0