搜索词>>docker 耗时0.0030
  • docker入门使用教程linux系统docker制作教程

    docker入门使用教程/linux(centos)系统docker制作教程<h2>Docker简介</h2> Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 <h2>Docker 安装及使用</h2> <h2>①资源准备</h2> <ol> <li>docker-engine-1.7.1-1.el6.x86_64.rpm[非必须](docker引擎,也可以通过yum安装)</li> </ol> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assist/images/blog/f5ab2b77-0a42-4648-9aa9-0dcd6f01e546.png" /> <ol> <li>docker-centos6.8-tomcat-image.zip[必须](docker制作好的景象文件【最后讲解制作方法】)</li> </ol> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assist/images/blog/557337cb-d34f-4e77-94c3-0ca6521dd4f7.png" /> <p><strong>注意安装docker的系统如果是centos6,请将内核升级到3.X版本2.X版本可能会出现意想不到的问题</strong></p> <h2>②安装docker</h2> 命令: <pre> <code>@注意,在cenos7版本安装的名字是docker,所以命令是yum install docker,可先通过yum list|grep docker查看安装版本 #yum install docker</code></pre> <br /> 或者 <pre> <code>@这是通过下载rpm文件安装的方式 #yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm</code></pre>   <h2>③启动/停止/查看</h2> 启动命令: <pre> <code>#service docker start</code></pre> <br /> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assist/images/blog/fd526343-2ed7-4d2a-a543-21c63f575812.png" /><br /> 查看docker信息命令: <pre> <code># docker info</code></pre> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assist/images/blog/4fa55562-0fba-4855-852c-5ed8fce9c92b.png" /><br /> 停止docker命令 <pre> <code>#service docker stop</code></pre> <br /> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assist/images/blog/a6b36881-1959-4320-b97a-ca1c3f9cbe1a.png" /> <h2>④修改docker默认存储位置</h2> <pre> <code>#cd /var/lib # cp -rf docker docker.bak # cp -rf docker /data/docker/ # ln -s /data/docker docker </code></pre> <h2>⑤镜像准备</h2> 将镜像上传至服务器/data/images<br /> 解压上传的景象文件 <pre> <code># unzip docker-centos6.8-tomcat-image.zip</code></pre> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assist/images/blog/2e5999d4-240b-4ba7-ac83-b9ea8212d90f.png" /> <h2>⑥启动docker服务</h2> <pre> <code>#service docker start</code></pre> <h2>⑦Docker创建/载入景象<br /> 切换至解压的景象目录</h2> <pre> <code>#cd centos6_tomcat/</code></pre> <img class="img-thumbnail" src="/assist/images/blog/1c74d8ab-fd0a-4798-8d71-1fe12d959641.png" />Docker执行创建镜像 <pre> <code># docker build -t tomcat ./</code></pre> 最后结果图:<br /> <img class="img-thumbnail" src="/assist/images/blog/130dd457-9be7-48d2-b3dd-52f39248fee1.png" /><br /> <span style="color:#ff0000">[注意:]step不一定都是29</span> <h2>⑧创建一个docker容器</h2> 命令: <pre> <code># docker run -d -p 2000:22 -p 8000:8080 tomcat </code></pre> <img alt="⑧创建一个docker容器" class="img-thumbnail" src="/assist/images/blog/4418d97f-8332-4eaf-b60d-a765287e8be4.png" /> <h2>⑨挂载docker一个共享目录,共享于主机方式开启一个docker</h2> 命令 <pre> <code>[root@MiWiFi-R1CM-srv share]# docker run -d -p 2008:22 -p 8008:8080 -v /data/share:/opt/share --privileged=true tomcat ccc238337fe92d05b806d996f252e2ecc8747d509af435d06fd2de3058de7b83 [root@MiWiFi-R1CM-srv share]# ll</code></pre>   <pre> <code>参数说明: -p 2008:22 docker里面的22端口对应主机的2008端口,用于外部SSH访问 -p 8008:8080 -v /data/share:/opt/share 主机的/data/share共享给docker/opt/share目录,类似于mount挂载 tomcat 镜像名称 --privileged=true 解决因selinux引起的docker容器内部对共享目录的权限不足问题,如果不加这个参数请关闭selinux</code></pre> 登录docker,切换到共享目录写一个文件<br /> <img alt="1" class="img-thumbnail" src="/assist/images/blog/4c461325-5f83-4221-8456-ff85072b3ba4.png" /><br /> 回主机查看:<br /> <img alt="2" class="img-thumbnail" src="/assist/images/blog/122a5ae1-f1e0-45c3-88ec-3b9be2eb0acd.png" /><br /> 由此便可以共享目录<br /> <strong>共享目录的好处:<br /> 1.方便主机上数据备份<br /> 2.将应用数据放于共享目录,如果docker不幸挂了,没事儿数据还在主机上,提高容错性<br /> <br /> 其他运行参数:</strong> <h2>Usage</h2> <pre> <code>docker run [OPTIONS] IMAGE [COMMAND] [ARG...] </code></pre> <h2>Options</h2> <table> <thead> <tr> <td>Name, shorthand</td> <td>Default</td> <td>Description</td> </tr> </thead> <tbody> <tr> <td><code>--add-host</code></td> <td> </td> <td>Add a custom host-to-IP mapping (host:ip)</td> </tr> <tr> <td><code>--attach , -a</code></td> <td> </td> <td>Attach to STDIN, STDOUT or STDERR</td> </tr> <tr> <td><code>--blkio-weight</code></td> <td> </td> <td>Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)</td> </tr> <tr> <td><code>--blkio-weight-device</code></td> <td> </td> <td>Block IO weight (relative device weight)</td> </tr> <tr> <td><code>--cap-add</code></td> <td> </td> <td>Add Linux capabilities</td> </tr> <tr> <td><code>--cap-drop</code></td> <td> </td> <td>Drop Linux capabilities</td> </tr> <tr> <td><code>--cgroup-parent</code></td> <td> </td> <td>Optional parent cgroup for the container</td> </tr> <tr> <td><code>--cidfile</code></td> <td> </td> <td>Write the container ID to the file</td> </tr> <tr> <td><code>--cpu-count</code></td> <td> </td> <td>CPU count (Windows only)</td> </tr> <tr> <td><code>--cpu-percent</code></td> <td> </td> <td>CPU percent (Windows only)</td> </tr> <tr> <td><code>--cpu-period</code></td> <td> </td> <td>Limit CPU CFS (Completely Fair Scheduler) period</td> </tr> <tr> <td><code>--cpu-quota</code></td> <td> </td> <td>Limit CPU CFS (Completely Fair Scheduler) quota</td> </tr> <tr> <td><code>--cpu-rt-period</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Limit CPU real-time period in microseconds</td> </tr> <tr> <td><code>--cpu-rt-runtime</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Limit CPU real-time runtime in microseconds</td> </tr> <tr> <td><code>--cpu-shares , -c</code></td> <td> </td> <td>CPU shares (relative weight)</td> </tr> <tr> <td><code>--cpus</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Number of CPUs</td> </tr> <tr> <td><code>--cpuset-cpus</code></td> <td> </td> <td>CPUs in which to allow execution (0-3, 0,1)</td> </tr> <tr> <td><code>--cpuset-mems</code></td> <td> </td> <td>MEMs in which to allow execution (0-3, 0,1)</td> </tr> <tr> <td><code>--detach , -d</code></td> <td> </td> <td>Run container in background and print container ID</td> </tr> <tr> <td><code>--detach-keys</code></td> <td> </td> <td>Override the key sequence for detaching a container</td> </tr> <tr> <td><code>--device</code></td> <td> </td> <td>Add a host device to the container</td> </tr> <tr> <td><code>--device-cgroup-rule</code></td> <td> </td> <td>Add a rule to the cgroup allowed devices list</td> </tr> <tr> <td><code>--device-read-bps</code></td> <td> </td> <td>Limit read rate (bytes per second) from a device</td> </tr> <tr> <td><code>--device-read-iops</code></td> <td> </td> <td>Limit read rate (IO per second) from a device</td> </tr> <tr> <td><code>--device-write-bps</code></td> <td> </td> <td>Limit write rate (bytes per second) to a device</td> </tr> <tr> <td><code>--device-write-iops</code></td> <td> </td> <td>Limit write rate (IO per second) to a device</td> </tr> <tr> <td><code>--disable-content-trust</code></td> <td><code>true</code></td> <td>Skip image verification</td> </tr> <tr> <td><code>--dns</code></td> <td> </td> <td>Set custom DNS servers</td> </tr> <tr> <td><code>--dns-opt</code></td> <td> </td> <td>Set DNS options</td> </tr> <tr> <td><code>--dns-option</code></td> <td> </td> <td>Set DNS options</td> </tr> <tr> <td><code>--dns-search</code></td> <td> </td> <td>Set custom DNS search domains</td> </tr> <tr> <td><code>--entrypoint</code></td> <td> </td> <td>Overwrite the default ENTRYPOINT of the image</td> </tr> <tr> <td><code>--env , -e</code></td> <td> </td> <td>Set environment variables</td> </tr> <tr> <td><code>--env-file</code></td> <td> </td> <td>Read in a file of environment variables</td> </tr> <tr> <td><code>--expose</code></td> <td> </td> <td>Expose a port or a range of ports</td> </tr> <tr> <td><code>--group-add</code></td> <td> </td> <td>Add additional groups to join</td> </tr> <tr> <td><code>--health-cmd</code></td> <td> </td> <td>Command to run to check health</td> </tr> <tr> <td><code>--health-interval</code></td> <td> </td> <td>Time between running the check (ms|s|m|h) (default 0s)</td> </tr> <tr> <td><code>--health-retries</code></td> <td> </td> <td>Consecutive failures needed to report unhealthy</td> </tr> <tr> <td><code>--health-start-period</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.29/" rel="external nofollow" target="_blank">API 1.29+</a><br /> Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)</td> </tr> <tr> <td><code>--health-timeout</code></td> <td> </td> <td>Maximum time to allow one check to run (ms|s|m|h) (default 0s)</td> </tr> <tr> <td><code>--help</code></td> <td> </td> <td>Print usage</td> </tr> <tr> <td><code>--hostname , -h</code></td> <td> </td> <td>Container host name</td> </tr> <tr> <td><code>--init</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Run an init inside the container that forwards signals and reaps processes</td> </tr> <tr> <td><code>--interactive , -i</code></td> <td> </td> <td>Keep STDIN open even if not attached</td> </tr> <tr> <td><code>--io-maxbandwidth</code></td> <td> </td> <td>Maximum IO bandwidth limit for the system drive (Windows only)</td> </tr> <tr> <td><code>--io-maxiops</code></td> <td> </td> <td>Maximum IOps limit for the system drive (Windows only)</td> </tr> <tr> <td><code>--ip</code></td> <td> </td> <td>IPv4 address (e.g., 172.30.100.104)</td> </tr> <tr> <td><code>--ip6</code></td> <td> </td> <td>IPv6 address (e.g., 2001:db8::33)</td> </tr> <tr> <td><code>--ipc</code></td> <td> </td> <td>IPC mode to use</td> </tr> <tr> <td><code>--isolation</code></td> <td> </td> <td>Container isolation technology</td> </tr> <tr> <td><code>--kernel-memory</code></td> <td> </td> <td>Kernel memory limit</td> </tr> <tr> <td><code>--label , -l</code></td> <td> </td> <td>Set meta data on a container</td> </tr> <tr> <td><code>--label-file</code></td> <td> </td> <td>Read in a line delimited file of labels</td> </tr> <tr> <td><code>--link</code></td> <td> </td> <td>Add link to another container</td> </tr> <tr> <td><code>--link-local-ip</code></td> <td> </td> <td>Container IPv4/IPv6 link-local addresses</td> </tr> <tr> <td><code>--log-driver</code></td> <td> </td> <td>Logging driver for the container</td> </tr> <tr> <td><code>--log-opt</code></td> <td> </td> <td>Log driver options</td> </tr> <tr> <td><code>--mac-address</code></td> <td> </td> <td>Container MAC address (e.g., 92:d0:c6:0a:29:33)</td> </tr> <tr> <td><code>--memory , -m</code></td> <td> </td> <td>Memory limit</td> </tr> <tr> <td><code>--memory-reservation</code></td> <td> </td> <td>Memory soft limit</td> </tr> <tr> <td><code>--memory-swap</code></td> <td> </td> <td>Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap</td> </tr> <tr> <td><code>--memory-swappiness</code></td> <td><code>-1</code></td> <td>Tune container memory swappiness (0 to 100)</td> </tr> <tr> <td><code>--mount</code></td> <td> </td> <td>Attach a filesystem mount to the container</td> </tr> <tr> <td><code>--name</code></td> <td> </td> <td>Assign a name to the container</td> </tr> <tr> <td><code>--net</code></td> <td> </td> <td>Connect a container to a network</td> </tr> <tr> <td><code>--net-alias</code></td> <td> </td> <td>Add network-scoped alias for the container</td> </tr> <tr> <td><code>--network</code></td> <td> </td> <td>Connect a container to a network</td> </tr> <tr> <td><code>--network-alias</code></td> <td> </td> <td>Add network-scoped alias for the container</td> </tr> <tr> <td><code>--no-healthcheck</code></td> <td> </td> <td>Disable any container-specified HEALTHCHECK</td> </tr> <tr> <td><code>--oom-kill-disable</code></td> <td> </td> <td>Disable OOM Killer</td> </tr> <tr> <td><code>--oom-score-adj</code></td> <td> </td> <td>Tune host’s OOM preferences (-1000 to 1000)</td> </tr> <tr> <td><code>--pid</code></td> <td> </td> <td>PID namespace to use</td> </tr> <tr> <td><code>--pids-limit</code></td> <td> </td> <td>Tune container pids limit (set -1 for unlimited)</td> </tr> <tr> <td><code>--platform</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file" rel="external nofollow" target="_blank">experimental (daemon)</a><a href="https://docs.docker.com/engine/api/v1.32/" rel="external nofollow" target="_blank">API 1.32+</a><br /> Set platform if server is multi-platform capable</td> </tr> <tr> <td><code>--privileged</code></td> <td> </td> <td>Give extended privileges to this container</td> </tr> <tr> <td><code>--publish , -p</code></td> <td> </td> <td>Publish a container’s port(s) to the host</td> </tr> <tr> <td><code>--publish-all , -P</code></td> <td> </td> <td>Publish all exposed ports to random ports</td> </tr> <tr> <td><code>--read-only</code></td> <td> </td> <td>Mount the container’s root filesystem as read only</td> </tr> <tr> <td><code>--restart</code></td> <td><code>no</code></td> <td>Restart policy to apply when a container exits</td> </tr> <tr> <td><code>--rm</code></td> <td> </td> <td>Automatically remove the container when it exits</td> </tr> <tr> <td><code>--runtime</code></td> <td> </td> <td>Runtime to use for this container</td> </tr> <tr> <td><code>--security-opt</code></td> <td> </td> <td>Security Options</td> </tr> <tr> <td><code>--shm-size</code></td> <td> </td> <td>Size of /dev/shm</td> </tr> <tr> <td><code>--sig-proxy</code></td> <td><code>true</code></td> <td>Proxy received signals to the process</td> </tr> <tr> <td><code>--stop-signal</code></td> <td><code>SIGTERM</code></td> <td>Signal to stop a container</td> </tr> <tr> <td><code>--stop-timeout</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Timeout (in seconds) to stop a container</td> </tr> <tr> <td><code>--storage-opt</code></td> <td> </td> <td>Storage driver options for the container</td> </tr> <tr> <td><code>--sysctl</code></td> <td> </td> <td>Sysctl options</td> </tr> <tr> <td><code>--tmpfs</code></td> <td> </td> <td>Mount a tmpfs directory</td> </tr> <tr> <td><code>--tty , -t</code></td> <td> </td> <td>Allocate a pseudo-TTY</td> </tr> <tr> <td><code>--ulimit</code></td> <td> </td> <td>Ulimit options</td> </tr> <tr> <td><code>--user , -u</code></td> <td> </td> <td>Username or UID (format: <name|uid>[:<group|gid>])</td> </tr> <tr> <td><code>--userns</code></td> <td> </td> <td>User namespace to use</td> </tr> <tr> <td><code>--uts</code></td> <td> </td> <td>UTS namespace to use</td> </tr> <tr> <td><code>--volume , -v</code></td> <td> </td> <td>Bind mount a volume</td> </tr> <tr> <td><code>--volume-driver</code></td> <td> </td> <td>Optional volume driver for the container</td> </tr> <tr> <td><code>--volumes-from</code></td> <td> </td> <td>Mount volumes from the specified container(s)</td> </tr> <tr> <td><code>--workdir , -w</code></td> <td> </td> <td>Working directory inside the container</td> </tr> </tbody> </table>   <h2>⑩其他docker命令</h2> 1.查看正在运行的容器 <pre> <code>#docker ps</code></pre> <img alt="查看正在运行的容器" class="img-thumbnail" src="/assist/images/blog/84400554-b91c-4d09-a533-5509b5eb2ab6.png" /><br /> #docker ps -a为查看所有的容器,包括已经停止的。<br /> 2.    容器的启动,停止,杀死<br /> 启动容器 <pre> <code># docker start <容器名orID></code></pre> 停止容器 <pre> <code># docker stop <容器名orID></code></pre> 杀死容器 <pre> <code> #docker kill <容器名orID></code></pre> 3.    删除容器<br /> 通过容器ID删除 <pre> <code>#docker rm –f <容器名orID></code></pre> 删除所有容器 <pre> <code> # docker rm -f $(docker ps -a -q)</code></pre> 4.查看镜像 <pre> <code># docker images</code></pre> <br /> <img alt="查看镜像" class="img-thumbnail" src="/assist/images/blog/07c49eeb-50d2-4972-b565-53f32f0f62a5.png" /><br /> 删除所有镜像 <pre> <code> #docker rmi -f $(docker images -q)</code></pre> Docker Tomcat基础镜像制作<br /> 本案例采用centos6.8进行在线制作<br /> [centos/redhat系列工具为febootstrap]<br /> [debian/ubuntu系列工具debootstrap] <h2>Centos 6.8 tomcat运行环境docker镜像制作</h2> <h3>①资源准备</h3> 1.epel源安装包<br /> <img alt="epel源安装包" class="img-thumbnail" src="/assist/images/blog/e76b59b0-faf1-4a06-bb15-40bc5f25e92d.png" /><br />  EPEL 是yum的一个软件源,里面包含了许多基本源里没有的软件。<br /> ​2.febootstrap安装包<br /> 一般使用yum命令在线安装 <h3>②安装相关工具</h3> 1.如果当前运行系统版本为centos6.X需要安装epel源 <strong><em> </em></strong> <pre> <code># yum install epel-release-6-8.noarch.rpm -y</code></pre> <img alt="安装相关工具" class="img-thumbnail" src="/assist/images/blog/10bf5746-f91f-459e-9856-2f98da46101d.png" /><br /> 2.安装febootstrap <pre> <code># yum install febootstrap –y</code></pre> <img alt="安装febootstrap" class="img-thumbnail" src="/assist/images/blog/1104e8ce-b73c-4235-a660-0de4be51b363.png" /> <h3>③使用febootstrap创建一个类似虚拟机的系统</h3> 创建空白环境命令 <pre> <code>#febootstrap -i bash  -i yum -i iputils -i iproute -i man -i vi -i openssh-server -i openssh-clients -i tar -i gzip -i unzip -i passwd  centos6.8 centos6.8-image http://mirrors.aliyun.com/centos/6.8/os/x86_64/</code></pre> 创建httpd+php环境 <pre> <code> febootstrap -i bash -i yum -i iputils -i iproute -i man -i vi -i openssh-server -i openssh-clients -i tar -i gzip -i unzip -i passwd -i httpd -i httpd-devel -i php -i php-devel -i php-mysql -i php-gd -i php-imap -i php-ldap -i php-odbc -i php-pear -i php-xml -i php-xmlrpc CentOS7.3 centos7.3-image http://mirrors.aliyun.com/centos/6.9/os/x86_64/</code></pre> <br /> 创建Java8环境 <pre> <code> febootstrap -i bash -i yum -i iputils -i iproute -i man -i vi -i openssh-server -i openssh-clients -i tar -i gzip -i unzip -i passwd -i java-1.8.0-openjdk.x86_64 CentOS7.3 centos7.3-image http://mirrors.aliyun.com/centos/6.9/os/x86_64/</code></pre> <br /> <br /> 其中 <br /> –i表示要安装的工具包<br /> centos6.8 系统版本<br /> centos6.8-image 等会执行完成后将在当前目录生成一个名字为centos6.8-image的文件夹<br /> http://mirrors.aliyun.com/centos/6.8/os/x86_64/ 镜像来源参照,这里使用的阿里的镜像库<br /> 命令执行完成将生成一个centos6.8-image文件夹,其内部结构似一个系统的结构<br /> <br /> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assist/images/blog/075165f8-fd11-4200-a2d6-e4924b64c11f.png" /><br /> 将当前系统的root用户目录下的.bash开头的文件复制到/root目录<br /> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assist/images/blog/4428ae07-db97-4a04-b69b-2fc13afc1ef5.png" /><br /> 命令 <pre> <code>#cp /root/.bash*  存放路径/centos6.8-image/root</code></pre> 打包镜像目录<br /> 首先进入镜像目录 <pre> <code>#cd cd centos6.8-image/</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assist/images/blog/38c0854b-2d44-403e-9a00-c96a27262087.png" /><br /> 使用tar打包,注意不能使用z参数启用gzip <pre> <code>#tar -cvf centos6.8.tar ./</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assist/images/blog/8bca9b1f-7570-42a2-8180-f1862ce41b38.png" /><br /> 查看当前tar包大小<br /> 命令: <pre> <code>#du -h centos6.8.tar</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assist/images/blog/31fae0cf-8e8a-47a8-98bc-4af79a038825.png" /><br /> 执行xz命令进行再次高效率压缩,执行xz命令需要一段时间 <pre> <code>#xz centos6.8.tar</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assist/images/blog/1ff8e4f9-fcc8-408b-bf2a-697d8e7a6803.png" /><br /> 使用xz命令效果还是明显的,396MB压缩到83MB <h3>④创建docker镜像</h3> 首先创建一个docker的配置文件名字必须为Dockerfile<br /> 将上面生成的centos6.8文件复制到同一个目录,将jdk以及tomcat也复制到同一个目录<br /> <img alt="创建docker镜像" class="img-thumbnail" src="/assist/images/blog/fb5732e8-3bd1-4c85-9775-695c4d6129c6.png" /><br /> Jdk为linux免安装版本打包成zip,Tomcat由linux版本的tar包解压打包成的zip包<br /> 接下来就是Dockerfile的配置 <pre> <code># # 安装: docker build -t tomcat ./ # 运行: docker run -d -p 8822:22 -p 8888:8080 tomcat # 挂载: docker run -d -p 8822:22 -p 8888:8080 -v /mnt/data/vr:/opt/tomcat/webapps/ROOT -h java-test --name java-dev tomcat #其他参数: #-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; #-d: 后台运行容器,并返回容器ID; #-i: 以交互模式运行容器,通常与 -t 同时使用; #-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; #--name="nginx-lb": 为容器指定一个名称; #--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; #--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; #-h "mars": 指定容器的hostname; #-e username="ritchie": 设置环境变量; #--env-file=[]: 从指定文件读入环境变量; #--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; #-m :设置容器使用内存最大值; #--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; #--link=[]: 添加链接到另一个容器; #--expose=[]: 开放一个端口或一组端口; #安装本地Centos FROM scratch MAINTAINER The CentOS Project <1441023520@qq.com> #添加基础镜像到根目录 ADD centos6.8.tar.xz / LABEL Vendor="CentOS" LABEL License=GPLv2 CMD ["/bin/bash"] #安装需要安装的额外软件 #安装openssh和unzip工具 #RUN yum install unzip -y #RUN yum install openssh-server -y #生成ssh的登陆证书 RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N '' #修改ssh-server的配置 RUN sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config RUN sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config #修改当前系统的ROOT密码 RUN echo "root:root" > /tmp/tmp.pass RUN chpasswd < /tmp/tmp.pass #外部工具相关 ADD tomcat.zip /tmp/tomcat.zip ADD jdk.zip /tmp/jdk.zip #解压相关项目 RUN unzip /tmp/tomcat.zip -d /opt RUN unzip /tmp/jdk.zip -d /opt #设置环境变量 RUN echo "" >> /etc/profile RUN echo "JAVA_HOME=/opt/jdk" >> /etc/profile RUN echo "PATH=/opt/jdk/bin:$PATH" >> /etc/profile RUN echo "CLASSPATH=.:/opt/jdk/lib/dt.jar:/opt/jdk/lib/tools.jar" >> /etc/profile RUN echo "export JAVA_HOME" >> /etc/profile RUN echo "export PATH" >> /etc/profile RUN echo "export CLASSPATH" >> /etc/profile #设置系统时区 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV JAVA_HOME /opt/jdk ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/jdk/bin:/opt/tomcat/bin #设置语言,解决乱码 RUN echo "export LC_ALL=zh_CN.UTF-8" >> /etc/profile #设置读写权限 RUN chmod -R 755 /opt #设置进入启动项 ENTRYPOINT /opt/tomcat/bin/startup.sh & /usr/sbin/sshd -D </code></pre> <br /> 注意:最后的启动项一定要配置sshd的。否则docker容器将无法使用SSH工具连入<br /> 以上便是一个运行Tomcat的环境的基础镜像制作方法. <h2>Alpine linux tomcat环境docker镜像</h2> ①Dockerfile: <pre> <code>FROM alpine:3.4 MAINTAINER cSphere <docker@csphere.cn> #安装 bash curl ca-certificates工具 RUN apk add --no-cache --update-cache bash RUN apk add --no-cache --update-cache curl ca-certificates   #证书 RUN curl -Lo  /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub #下载glibc相关包 RUN curl -Lo /etc/apk/keys/sgerrand.rsa.pub https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/sgerrand.rsa.pub RUN curl -Lo glibc-2.23-r3.apk  https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-2.23-r3.apk RUN curl -Lo glibc-bin-2.23-r3.apk  https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-bin-2.23-r3.apk RUN curl -Lo glibc-i18n-2.23-r3.apk  https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-i18n-2.23-r3.apk #安装glibc RUN apk add  glibc-2.23-r3.apk glibc-bin-2.23-r3.apk glibc-i18n-2.23-r3.apk   #安装SSH RUN apk update RUN apk --no-cache add openssh   #生成ssh的登陆证书 RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key  -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''   #修改当前系统的ROOT密码 RUN echo "root:root" > /tmp/tmp.pass RUN chpasswd < /tmp/tmp.pass   CMD ["/bin/bash"]   #Java环境 ADD tomcat.zip /opt/tomcat.zip ADD jdk.zip /opt/jdk.zip #解压 RUN unzip  /opt/tomcat.zip -d /opt RUN unzip  /opt/jdk.zip -d /opt #设置环境变量 RUN echo "" >> /etc/profile RUN echo "JAVA_HOME=/opt/jdk" >> /etc/profile RUN echo "PATH=/opt/jdk/bin:$PATH" >> /etc/profile RUN echo "CLASSPATH=.:/opt/jdk/lib/dt.jar:/opt/jdk/lib/tools.jar" >> /etc/profile RUN echo "export JAVA_HOME" >> /etc/profile RUN echo "export PATH" >> /etc/profile RUN echo "export CLASSPATH" >> /etc/profile   #设置时区 ADD Chongqing /etc/localtime     #设置进入启动项 ENTRYPOINT  /usr/sbin/sshd -D</code></pre>  
  • windows 如何更改Docker镜像目录

    背景Windows版本(Windows 10)docker 默认程序安装到c盘,数据存放于 C:\Users\当前用户名\AppData\Local\Docker\wsl\data\ext4.vhdx 这样会导致docker使用量上去C盘的背景Windows版本(Windows 10)docker 默认程序安装到c盘,数据存放于 C:\Users\当前用户名\AppData\Local\Docker\wsl\data\ext4.vhdx 这样会导致docker使用量上去C盘的空间越来越大。为了解决这个问题我们一般习惯性将数据部分移动到其他盘。WSL 2 版本Docker切换盘位操作详细1.停止docker通过windows系统的界面操作停止​打开cmd窗口。查看停止情况:C:\Users\xqlee-mobile>wsl --list -v NAME                   STATE           VERSION * docker-desktop-data   Stopped         2 docker-desktop         Stopped         22.备份导出目前已有的数据C:\Users\xqlee-mobile>wsl --export docker-desktop-data "D:\Docker\wsl\data\docker-desktop-data.tar"命令说明:将目前已有的数据备份到D:\Docker\wsl\data\目录下,并命名为docker-desktop-data.tar3.删除原有数据C:\Users\xqlee-mobile>wsl --unregister docker-desktop-data 正在注销... 说明:解除当前的docker 数据虚拟盘映射,该操作后会删除原有的ext4.vhdx (数据未备份前请谨慎操作)4.导入数据到新盘C:\Users\xqlee-mobile>wsl --import docker-desktop-data "D:\Docker\wsl\data" "D:\Docker\wsl\data\docker-desktop-data.tar" --version 2说明:将备份数据导入到新的虚拟盘,且指定虚拟盘的存放路径为D:\Docker\wsl\data,导入完成后在该目录下会存在一个ext4.vhdx的虚拟磁盘路径5.启动Docker在开始菜单中找到docker点击启动即可最后备份的文件D:\Docker\wsl\data\docker-desktop-data.tar可根据情况删除 图像 小部件
  • Docker中容器/镜像的备份、恢复和迁移

    Docker中容器/镜像的备份、恢复和迁移Docker中容器/镜像的备份、恢复和迁移<br /> <br /> 今天,我们将学习如何快速地对docker容器进行快捷备份、恢复和迁移。Docker是一个开源平台,用于自动化部署应用,以通过快捷的途径在称之为容器的轻量级软件层下打包、发布和运行这些应用。它使得应用平台独立,因为它扮演了Linux上一个额外的操作系统级虚拟化的自动化抽象层。它通过其组件cgroups和命名空间利用Linux内核的资源分离特性,达到避免虚拟机开销的目的。它使得用于部署和扩展web应用、数据库和后端服务的大规模构建组件无需依赖于特定的堆栈或供应者。<br /> <br />     docker的容器,就是那些创建自Docker镜像的软件层,它包含了独立的Linux文件系统和开箱即用的应用程序。如果我们有一个在机器中运行着的Docker容器,并且想要备份这些容器以便今后使用,或者想要迁移这些容器,那么,本教程将帮助你掌握在Linux操作系统中备份、恢复和迁移Docker容器的方法。<br /> <br /> 我们怎样才能在Linux中备份、恢复和迁移Docker容器呢?这里为您提供了一些便捷的步骤。<br />   <h4>1. 备份容器</h4> <p>首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表。要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命令。<br />  </p> <pre> <code># docker ps</code></pre> <img alt="docker ps" class="img-thumbnail" src="/assist/images/blog/5195bcfb-26a0-4d56-a467-e5aeb74502b1.png" style="height:100px; width:1184px" />上图列出来的就是在运行的docker容器环境(<em>Docker Containers List</em>)<br /> <br /> 在此之后,我们要选择我们想要备份的容器,然后去创建该容器的快照。我们可以使用 docker commit 命令来创建快照。 <pre> <code>#docker commit -p 23b16cef00c8 container-tomcat-backup</code></pre> <img alt="docker commit" class="img-thumbnail" src="/assist/images/blog/3120a9d3-1c61-408e-88ba-3478ed7b1712.png" style="height:114px; width:661px" /><br /> 说明:<br /> 1.23b16cef00c8 :容器ID<br /> 2.container-tomcat-backup:备份的景象/快照名称<br /> 3.执行该操作所耗时间与容器的大小相关,容器里面东西越多,越耗时间<br /> 4.该命令会生成一个作为Docker镜像的容器快照,我们可以通过运行 <code>docker images</code> 命令来查看Docker镜像<br />   <pre> <code>#docker images</code></pre> <br /> <img alt="docker images" class="img-thumbnail" src="/assist/images/blog/9265b4da-e97e-4149-93d2-561f240cceb4.png" style="height:133px; width:735px" /><br /> <br /> 现在快照已经创建,有两种方式可以保持镜像<br /> 1.登录docker用户中心,并将该镜像推送上去<br /> 2.导出本地<br /> <br /> 这里我们讲解第二种方式,实际运用中第二种也比较多,毕竟备份的容器过大恢复和推送到docker中心都需要大量的时间<br /> <br /> 备份命令: <pre> <code>#docker save -o /data/images-backup/container-tomcat-backup.tar container-tomcat-backup</code></pre> 说明:<br /> 1./data/images-backup/container-tomcat-backup.tar镜像导出存放路径<br /> 2.container-tomcat-backup 镜像在docker里面的名字<br /> <br /> 恢复命令: <pre> <code>#docker load -i /data/images-backup/container-tomcat-backup.tar</code></pre> <br /> 说明:<br /> /data/images-backup/container-tomcat-backup.tar备份的镜像路径
  • Docker部署spring boot 入门

    在本文中,您将学习如何构建用于运行Spring引导应用程序的Docker镜像。我首先给你一个docker的简要概念,然后我们将为我们的spring启动应用程序创建一个docker镜像,并在本地运行它。最后,我们会将码头图像推送到docker 中心库。<h2>前言</h2>     在本文中,您将学习如何构建用于运行Spring引导应用程序的Docker镜像。我首先给你一个docker的简要概念,然后我们将为我们的spring启动应用程序创建一个docker镜像,并在本地运行它。最后,我们会将码头图像推送到docker 中心库。<br />   <h2 style="margin-left:0px; margin-right:0px; text-align:start">快速介绍Docker</h2> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><a rel="external nofollow" target="_blank" href="https://www.docker.com/" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word">Docker</a>是一个软件平台,它使开发人员能够借助<strong>容器</strong>在任何地方开发,发布和运行应用程序。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在什么是容器,码头工人用容器解决什么问题?</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">好吧,让我们通过提出几个问题来理解。以下任何一种情况对您而言都很熟悉?</span></span></span></p> <ul> <li style="margin-left: 0px; margin-right: 0px;"><em>“它在<strong>我的机器</strong>上运行!!”</em></li> <li style="margin-left: 0px; margin-right: 0px;"><em>“我认为你的<strong>Tomcat版本</strong>已经过时了!</em></li> <li style="margin-left: 0px; margin-right: 0px;"><em>“我不想在运行应用程序之前安装10个不同的库和工具。难道它不能以<strong>包装形式</strong>提供它需要的所有库和工具吗?“</em></li> <li style="margin-left: 0px; margin-right: 0px;"><em>“我们有用不同的语言,工具,系统库和环境编写的应用程序。我们可以在<strong>同一个基础架构</strong>上独立运行它们吗?“</em></li> </ul> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">我敢打赌他们中的一些人。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">Docker通过为应用程序创建一个轻量级的独立可执行程序包来解决这些问题,该程序包包括运行代码,运行时,库,工具,环境和配置所需的一切。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">这些独立的可执行程序包称为<strong>码头图像</strong>。而一个正在运行的Docker镜像实例称为<strong>码头容器</strong>。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在,这些容器图像可以在任何环境中的任何地方共享,发货和运行。无论他们运行的环境如何,他们的表现都完全一样。</span></span></span></p> <img alt="docker简介" class="img-thumbnail" src="/assist/images/blog/105bde037060487da104f2b687d37257.jpg" /> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">而且,您可以在同一个基础架构上运行多个完全不同配置的容器。所有容器都是完全隔离的,彼此独立运行。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">很酷,不是吗?那么,让我们现在学习如何在Docker容器中运行Spring Boot应用程序。但在此之前,请继续在您的平台上<a rel="external nofollow" target="_blank" href="https://www.docker.com/community-edition/" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word">安装Docker社区版</a>。</span></span></span></p> <h2 style="margin-left:0px; margin-right:0px; text-align:start">使用Docker的Spring Boot:Docker化Spring Boot应用程序</h2> <h3 style="margin-left:0px; margin-right:0px; text-align:start">1.将应用程序下载到Dockerize</h3> 在本文中,我们将dockerize一个基于web套接字的群组聊天应用程序,这个应用程序是用spring引导的。<br /> <br />   <h3 style="margin-left:0px; margin-right:0px; text-align:start">2.使用Dockerfile定义Docker镜像</h3> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">转到应用程序的根目录并创建一个名为的新文件<code>Dockerfile</code>。</span></span></span></p> <pre> <code class="language-html">$ cd spring-boot-websocket-chat-demo $ touch Dockerfile</code></pre> Dockerfile是我们定义Docker镜像并指定运行应用程序所需的所有配置的地方。以下是我们的Spring boot应用程序的Dockerfile - <pre> <code class="language-html"># Start with a base image containing Java runtime FROM openjdk:8-jdk-alpine # Add Maintainer Info LABEL maintainer="xxx@gmail.com" # Add a volume pointing to /tmp VOLUME /tmp # Make port 8080 available to the world outside this container EXPOSE 8080 # The application's jar file ARG JAR_FILE=target/websocket-demo-0.0.1-SNAPSHOT.jar # Add the application's jar to the container ADD ${JAR_FILE} websocket-demo.jar # Run the jar file ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/websocket-demo.jar"]</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">Dockerfile非常简单且具有声明性。让我们通过Dockerfile的每一行来理解细节。</span></span></span></p> <ul> <li style="margin-left: 0px; margin-right: 0px;"><strong>FROM</strong>:泊坞窗图像可以使用Docker注册表中可用的其他图像作为其基础或父图像。在上面的例子中,我们使用<a rel="external nofollow" target="_blank" href="https://hub.docker.com/_/openjdk/" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word"><code>openjdk:8-jdk-alpine</code></a>图像作为我们的基础图像。这是一个使用Alpine Linux的非常轻量级的OpenJDK 8运行时映像。(它非常适合小型Java微服务。)</li> <li style="margin-left: 0px; margin-right: 0px;"><strong>LABEL</strong>:该<code>LABEL</code>指令用于向图像添加元数据。在上面的Dockerfile中,我们<code>maintainer</code>通过<code>LABEL</code>指令添加了一些关于图像的信息。</li> <li style="margin-left: 0px; margin-right: 0px;"><strong>VOLUME</strong>:卷是一种机制,用于在主机操作系统上保留容器生成的数据,并使用容器共享主机操作系统中的目录。</li> <li style="margin-left: 0px; margin-right: 0px;">该<code>VOLUME</code>指令使用指定的路径在容器上创建一个安装点。运行容器时,可以指定给定安装点将映射到的Hot OS上的目录。之后,容器写入挂载路径的任何内容都将写入主机操作系统上的映射目录。</li> <li style="margin-left: 0px; margin-right: 0px;">卷最常见的用例之一是将容器生成的日志文件存储在主机操作系统上。例如,假设您的应用程序将日志文件写入某个位置<code>/var/log/app.log</code>。</li> <li style="margin-left: 0px; margin-right: 0px;">您可以在Dockerfile中安装一个<code>VOLUME</code>带有路径的路径<code>/var/log</code>,然后在运行该容器时指定该安装点将映射到的主机操作系统上的目录。之后,您将能够从主机操作系统上的映射目录访问日志。</li> <li style="margin-left: 0px; margin-right: 0px;">在上面<code>Dockerfile</code>,我们创建了一个带有路径的挂载点,<code>/tmp</code>因为这是默认情况下Spring引导应用程序为Tomcat创建工作目录的地方。尽管这个spring引导应用程序并不需要它,因为谁在乎tomcat目录。但是如果你想存储诸如tomcat访问日志等东西,那么VOLUMES非常有用。</li> <li style="margin-left: 0px; margin-right: 0px;">您可以从<a rel="external nofollow" target="_blank" href="https://docs.docker.com/storage/volumes/" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word">官方文档中</a>了解更多关于卷的<a rel="external nofollow" target="_blank" href="https://docs.docker.com/storage/volumes/" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word">信息</a>。</li> <li style="margin-left: 0px; margin-right: 0px;"><strong>EXPOSE</strong>:顾名思义,这条指令允许你将某个端口暴露给外部世界。</li> <li style="margin-left: 0px; margin-right: 0px;"><strong>ARG</strong>:<code>ARG</code>指令定义了一个默认值的变量。您可以通过在构建时传递它来覆盖该变量的默认值。</li> <li style="margin-left: 0px; margin-right: 0px;"> <pre> <code class="language-html">ARG <name>[=<default value>]</code></pre> </li> <li style="margin-left: 0px; margin-right: 0px;">一旦定义,该变量可以被其后的指令使用。</li> <li style="margin-left: 0px; margin-right: 0px;"><strong>ADD</strong>:该<code>ADD</code>指令用于将新文件和目录复制到泊坞窗图像。</li> <li style="margin-left: 0px; margin-right: 0px;"><strong>入口点</strong>:这是配置应用程序在容器内执行的方式。</li> </ul>   <h3 style="margin-left:0px; margin-right:0px; text-align:start">3.构建Docker镜像</h3> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在我们已经定义了<code>Dockerfile</code>,让我们为我们的应用程序构建一个docker镜像。从项目的根目录键入以下命令来构建docker 镜像 -</span></span></span></p> <pre> <code class="language-html">$ docker build -t spring-boot-websocket-chat-demo .</code></pre> 您可以使用以下命令查看系统上所有泊docker 镜像的列表 - <pre> <code class="language-html">$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE spring-boot-websocket-chat-demo latest 30ad8958ac67 22 hours ago 126MB openjdk 8-jdk-alpine 224765a6bdbe 3 months ago 102MB</code></pre> 这应该显示我们新建的docker镜像。 <h3 style="margin-left:0px; margin-right:0px; text-align:start">4.运行docker镜像</h3> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">一旦你有一个docker镜像,你可以使用<code>docker run</code>像这样的命令来运行它-</span></span></span></p> <pre> <code class="language-html">$ docker run -p 5000:8080 spring-boot-websocket-chat-demo</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">在该<code>run</code>命令中,我们指定<code>8080</code>容器上的端口应映射到<code>5000</code>主机操作系统上的端口。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">一旦应用程序启动,您应该可以访问它。<code>http://localhost:5000</code></span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">容器在前台运行,按下<code>CTRL + C</code>会停止它。现在让我们看看如何在后台运行容器。</span></span></span></p> <h4 style="margin-left:0px; margin-right:0px; text-align:start">在分离模式下在后台运行Docker镜像。</h4> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">您可以使用命令中的<code>-d</code>选项在<code>docker run</code>后台运行容器 -</span></span></span></p> <pre> <code class="language-html">$ docker run -d -p 5000:8080 spring-boot-websocket-chat-demo 1c3528715862a8a8efb712c85bc8ab61f3419c04eb6dc613af76c89846d316e0</code></pre> 上述命令在后台启动容器并为您提供容器ID。您可以使用以下命令查看系统中运行的所有容器的列表 - <pre> <code class="language-html">$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c3528715862 spring-boot-websocket-chat-demo "java -Djava.securit…" About a minute ago Up About a minute 8080/tcp, 0.0.0.0:4000->80/tcp vigorous_stallman</code></pre> <h3 style="margin-left:0px; margin-right:0px; text-align:start">5.将docker镜像推送到docker hub中心库</h3> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在让我们将码头图像推送到docker中央库,以便其他人可以下载并使用我们的镜像。</span></span></span></p> <ul style="margin-left:30px; margin-right:0px"> <li> <p style="margin-left:0px; margin-right:0px"><strong>用您的Docker ID登录</strong></p> <pre> <code class="language-html">$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username (callicoder): callicoder Password: Login Succeeded</code></pre> </li> </ul> <pre style="margin-left:0px; margin-right:0px; text-align:left"> <span style="background-color:#f6f8fa"><span style="font-family:monospace,monospace"><span style="color:rgba(0, 0, 0, 0.9)"><code class="language-bash"> </code></span></span></span></pre> <ul style="margin-left:30px; margin-right:0px"> <li> <p style="margin-left:0px; margin-right:0px"><strong>标记镜像</strong></p> <p style="margin-left:0px; margin-right:0px">要将本地图像推送到docker注册中心,您需要将本地图像与docker注册中心的存储库相关联。docker注册表上的存储库的表示法是<code>username/repository:tag</code>。</p> <p style="margin-left:0px; margin-right:0px">要标记图像,我们使用<code>docker tag</code>命令 -</p> <pre> <code class="language-html">$ docker tag image username/repository:tag</code></pre> </li> </ul> <br /> 例如,以下是我们如何标记Spring boot应用程序的本地映像 - <pre> <code class="language-html">$ docker tag spring-boot-websocket-chat-demo callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:left"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">请确保<code>callicoder</code>在上述命令中将我的用户名替换为docker id。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:left"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">标记完成后,您可以键入<code>docker image ls</code>终端以查看新标记的图像 -</span></span></span><br />  </p> <pre> <code class="language-html">$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE callicoder/spring-boot-websocket-chat-demo 0.0.1-SNAPSHOT 30ad8958ac67 23 hours ago 126MB spring-boot-websocket-chat-demo latest 30ad8958ac67 23 hours ago 126MB openjdk 8-jdk-alpine 224765a6bdbe 3 months ago 102MB</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:left"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>将图像推送到docker集线器</strong></span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:left"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">最后,<code>docker push</code>像这样使用该命令将标记的图像推送到docker集线器 -</span></span></span></p> <pre> <code class="language-html">$ docker push callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:left"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">再次,不要忘记<code>callicoder</code>用您的码头ID 替换用户名。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:left"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">就这样!镜像现在发布在码头集线器的以下链接 - https://hub.docker.com/r/callicoder/spring-boot-websocket-chat-demo/</span></span></span></p> <h3 style="margin-left:0px; margin-right:0px; text-align:start">6.从docker集线器中拉出镜像并运行它</h3> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">将图像发布到Docker集线器后,任何人都可以拉出该镜像并在其环境中运行它。输入以下命令以拉出并运行我们刚刚推送到docker中心的计算机上的映像 -</span></span></span></p> <pre> <code class="language-html">$ docker run -p 5000:8080 callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">如果该<code>docker run</code>命令在本地不可用,则该命令将从Docker集线器中提取图像,然后运行它。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">您看到与其他人分享您的镜像是多么容易。人们不需要安装任何软件来运行你的应用程序。他们只需要将镜像拖放到docker上即可运行。</span></span></span></p> <h2 style="margin-left:0px; margin-right:0px; text-align:start">使用dockerfile-maven-plugin自动化Docker镜像创建和发布</h2> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">您可以自动执行从Docker镜像构建到docker集线器发布的所有功能<code>dockerfile-maven-plugin</code>。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><code>pom.xml</code>使用以下配置将插件添加到文件中 -</span></span></span></p> <pre> <code class="language-xml"><plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <!-- replace `callicoder` with your docker id--> <repository>callicoder/spring-boot-websocket-chat-demo</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> <executions> <execution> <id>default</id> <phase>install</phase> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> </plugin></code></pre> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">插件的配置包括远程存储库名称和存储库标签。请使用元素中的<code>callicoder</code>泊坞窗ID 替换用户名<code><repository></code>。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">我们也在元素中传递<code>JAR_FILE</code>参数<code><buildArgs></code>。记得我们已经向<code>ARG JAR_FILE</code>Dockerfile 添加了指令吗?这里传递的参数将覆盖该值。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">这里是你如何使用<code>docker-file-maven</code>插件构建docker镜像-</span></span></span></p> <pre> <code class="language-html">$ mvn package dockerfile:build</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">上面的命令首先以jar文件的形式打包应用程序,然后构建docker镜像。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">最后,您可以使用<code>dockerfile:push</code>命令将docker映像推送到docker注册表-</span></span></span></p> <pre> <code class="language-html">$ mvn dockerfile:push</code></pre> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在,它进一步自动化,我们已经注册<code>dockerfile:build</code>和<code>dockerfile:push</code>目标落实到<code>install</code>使用Maven构建生命周期阶段<code><executions></code>的标签。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">所以每当你运行<code>mvn install</code>时,<code>build</code>和<code>push</code>目标<code>dockerfile-maven-plugin</code>执行,你的搬运工图像建成并推向泊坞窗枢纽。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">在<code>dockerfile-maven-plugin</code>使用存储在任何配置文件中的认证信息<code>~/.dockercfg</code>或<code>~/.docker/config.json</code>到泊坞窗图像推送到码头工人的个人资料。这些配置文件是通过登录docker时创建的<code>docker login</code>。</span></span></span></p> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">您也可以在maven <code>settings.xml</code>或<code>pom.xml</code>文件中指定验证细节。查看<a rel="external nofollow" target="_blank" href="https://github.com/spotify/dockerfile-maven#authenticating-with-maven-settingsxml" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word">该插件</a>的<a rel="external nofollow" target="_blank" href="https://github.com/spotify/dockerfile-maven#authenticating-with-maven-settingsxml" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word">官方自述文件以</a>获取更多信息。</span></span></span></p> <h2 style="margin-left:0px; margin-right:0px; text-align:start">总结</h2> <p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">我们在本文中停靠的应用程序非常简单。它不使用任何数据库或与其他服务进行通信。<br /> <br /> 附件中含上述spring boot项目下载</span></span></span></p>
  • docker常见问题汇总

    启动docker web服务时 虚拟机端口转发 外部无法访问,WARNING: IPv4 forwarding is disabled. Networking will not work.<h2>问题:WARNING: IPv4 forwarding is disabled. Networking will not work.</h2> <p>centos 7 docker 启动了一个web服务 但是启动时 报</p> <p>WARNING: IPv4 forwarding is disabled. Networking will not work.</p> <p>网上查询了下 需要做如下配置</p> <p> </p> 解决办法: <pre> <code class="language-html"># vi /etc/sysctl.conf</code></pre> <br /> 或者 <pre> <code class="language-html"># vi /usr/lib/sysctl.d/00-system.conf</code></pre> <br /> 添加如下代码:<br />     <pre> <code class="language-html">net.ipv4.ip_forward=1</code></pre> <br /> 重启network服务 <pre> <code class="language-html"># systemctl restart network</code></pre> <br /> 查看是否修改成功 <pre> <code class="language-html"># sysctl net.ipv4.ip_forward</code></pre> 如果返回为“net.ipv4.ip_forward = 1”则表示成功了 <h2>问题:docker telnet no route to host</h2> 引起原因:docker容器之间通过主机IP+主机端口相互通讯<br /> 解决方法:<br /> 检查主机防火墙规则,如果防火墙开着开放需要通讯的端口<br /> 参考:<a rel="" target="_blank"href="http://www.leftso.com/blog/163.html" rel="" target="_blank">centos7 防火墙开放端口</a> <h2>问题:docker 容器内部无法访问外网</h2> 引起原因:启动docker服务的时候防火墙服务(firewalld)未启动。docker服务启动后再启动firewalld服务导致无法访问外网。<br /> 解决办法:firewall启动的时候重启一下docker服务。然后在启动里面的容器
  • docker [Warning] IPv4 forwarding is disabled. 解决办法

    docker 镜像制作报错 [Warning] IPv4 forwarding is disabled. Networking will not work.问题解决办法docker 镜像制作报错 [Warning] IPv4 forwarding is disabled. Networking will not work.
  • centos7 Error starting daemon: layer does not exist

    centos7安装docker启动报错 Error starting daemon: layer does not existcentos7安装docker启动报错 Error starting daemon: layer does not exist<br /> 使用yum install docker安装完后启动不了,关闭selinux,无效<br /> <br /> <br /> 1.创建一个yum源 <pre> <code>vi /etc/yum.repos.d/docker.repo</code></pre> 内容: <pre> <code>[dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg</code></pre> <br /> 2.安装docker <pre> <code class="language-bash"> yum install docker-engine</code></pre> <br /> 好了尽情享用docker的美好吧。。。
  • Docker报错Error running DeviceCreate (createPool) dm_task_run failed,无法启动问题解决

    Docker报错Error running DeviceCreate (createPool) dm_task_run failed,无法启动问题解决<br />  <br /> 由于我这次docker挂掉起不来是因为docker容器目录磁盘空间爆满后的一些操作造成的文件系统写入异常(不可恢复)<br /> <br /> 解决步骤:<br /> <strong>1.删除docker的临时运行文件</strong> <pre> <code class="language-bash">rm -rf /var/lib/docker/*</code></pre> <br /> <span style="color:#FF0000"><strong>注意:删除前备份重要数据</strong></span><br /> <br /> <strong>2.导入docker镜像</strong><br /> <br /> <strong>3.启动镜像容器</strong><br />  
  • 黑群晖docker安装nextcloud云盘

    一.如何在黑群晖中安装nextcloud云盘资源准备:一台黑群晖/白裙也可以但是要支持docker安装docker套件二.下载nextcloud镜像 在docker的注册表搜索nextcloud镜像然后下载三.创建nextcloud运行容器一.如何在黑群晖中安装nextcloud云盘资源准备:一台黑群晖/白裙也可以但是要支持docker安装docker套件二.下载nextcloud镜像 在docker的注册表搜索nextcloud镜像然后下载三.创建nextcloud运行容器 选择nextcloud镜像​高级设置里面一些东西​设置一个装载路径(就是将群晖的硬盘映射到docker里面用)​搞个端口映射,外部才能访问docker里面的nextcloud服务​四.为nextcloud添加外网域名权限 填写域名就成如果不添加外网域名权限就会出现下面的错误​首先停止nextcloud容器进入nextcloud的文件目录找到 /config/config.php开始是没有编辑权限的,给nextcloud目录重新赋予SYSTEM用户组权限​然后开始编辑config.php文件 像下面这样添加域名​修改完成后保存文件启动容器就可以访问了​
  • 黑群晖安装transmission下载工具

    一.黑群晖安装transmission下载工具准备群晖一枚群晖安装docker套件群晖安装文本编辑套件二.transmission下载工具镜像下载在docker的注册表中搜索auska/docker-transmission并下载该镜像三.一.黑群晖安装transmission下载工具准备群晖一枚群晖安装docker套件群晖安装文本编辑套件二.transmission下载工具镜像下载在docker的注册表中搜索auska/docker-transmission并下载该镜像三.transmission下载工具容器创建 ​​挂载设置​端口设置​环境变量设置​IP+9091修改tr密码1 停止tr容器2 到tr配置文件目录​3编辑setting.json文件需要用到文本编辑器套件​找到这一行​修改成你需要的登陆密码"rpc-password":"这里是你的登录密码" 然后保存 重启transmission容器就好了