Docker获取镜像以及相关指令

常用命令:
docker仓库:hub.docker.com
docker pull 下载镜像,有可能因为镜像名被转移到新得镜像身上,所以可能会出现null得虚悬镜像pull/build
docker run -it --rm ubuntu:16.04 bash // 以交互的模式运行容器
docker exec -it ubuntu的容器id bash // 以交互的模式进入容器
docker run -p 8080:8080 tomcat // 将宿主机的8080端口映射到容器的8080,所以还可以是80:8080 启动tomcat 可以在端口号后边起容器的名字如 docker run -p 80:8080 --name tom1 tomcat
docker run -p 80:8080 --name tomcat1 -d tomcat // 以守护态运行
docker container tomcat1 // 删除所有终止的容器
docker ps
docker ps -a
docker rm 容器id
docker rmi
docker images
exit/Ctrl + D 退出容器

Docker获取镜像

docker pull ubuntu:16.04 命令中没有给出Docker镜像仓库的地址,因此会从Docker Hub获取镜像。

显示镜像:docker image ls

运行
docker run -it --rm
ubuntu:16.04
bash

运行基于ubuntu:16.04启动一个容器
-it 以交互的形式运行容器
命令太长的换行符
--rm 退出容器自动删除该容器
退出容器 exit/Ctrl+D

看正在运行的容器 docker ps
看所有的容器 docker ps -a

更新镜像 docker pull ubuntu16.04 即重新拉一次

镜像体积

虚悬镜像

:即镜像既没有仓库名,也没有标签,均为
原因是由docker pull和docker build时,因为官方镜像维护后,发布新版本,原来的镜像被转义到了新下载的镜像身上,而旧的镜像上的名字则被取消。
可以用以下命令专门显示这类镜像

对于Centos/RHEL的用户来说,在没有办法使用UnionFSd的情况下,一定要配置direct-lvm给devicemapper,无论是为了性能、稳定性还是空间利用率。

docker image rm ubuntu16.04;删容器
docker rmi 镜像id 删镜像

Dockerfile
Dockerfile脚本 用这个脚本来构建、定制进行
Dockerfile是一个文本文件,内包含一条条的指令,每一条指令构建一层

docker pull tomcat
docker images
docker image ls
docker run -it
tomcat
bash
此时路径为:/usr/local/tomcat
ls -al
自己装的软件必须安装在/usr/local

cd webapps ll
cd ROOT/
ls -al

echo "hello" > test.txt

docker run -8080:8080 tomcat

docker ps
docker ps -a

docker rm 容器id

docker images
docker run -p 8080:8080 tomcat

from tomcat为文件第一行
所有的dockerfile脚本必须有一个基础镜像
run <命令> <尖括号为必填内容>

docker run -it --rm tomcat bash
ls -al 
cd webapps/ 
cd ROOT/
ls -al
pwd

在/usr/local/docker 下创建一个目录

mkdir tomcat
cd tomcat/
ll
vi Dockerfile
FROM tomcat
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html

cat Dockerfile

写完脚本开始构建镜像

docker build -t shop .

其中. 表示当前目录,镜像的构建需要基于dockerfile当前目录 shop是标签,起的名字

docker run -it shop bash
ls -al
cd webapps/
ls -al
cd ROOT/
ls -al
cat index.html

删除ROOT目录所有文件
vi Dockerfile

FROM tomcat 
RUN cd /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html

报错了,把ROOT目录也删除了,
docker images

vi Dockerfile

FROM tomcat 
WORKDIR cd /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html

docker run -it --rm shop bash

ls -al
docker image prune
docker rmi imageID

容器是基于镜像的
先退出容器
docker ps
docker ps -a
docker ps imageID

docker build -t mysql .
寻找Dockfile 构建一个镜像上下文(Context)

cd /usr/local/docker/
ll
rm -fr mysql/
ll
cd com
rm -fr ROOT/
ll
cd tomcat/
HOST OS宿主机上操作docker build -t shop
将当前目录打包,请求RESTAPI,还带着这个目录的压缩包,
Docker Server接收Docker build 解压缩,构建镜像

COPY ./package.json /app/
这并不是要复制执行docker build 命令所在目录下的package.json,也不是复制DOckerfile所在目录下的package.json,而是复制上下文(context)目录下的package.json。这个命令中的源文件的路径是相对路径

拷贝index.html到

FROM tomcat
COPY index.html /usr/local/tomcat/webapps/ROOT/

docker build -t shop .

docker run -it --rm shop bash

学习要有目的性,以最快的方式完成任务

部署项目到Docker容器

  1. 拷贝shop.zip -> tomcat/webapps/ROOT/
  2. 修改访问端口号为80

COPY <源路径>...<目标路径>
// 源路径指的是上下文路径,即文件在docker server解压后得路径,目标路径指的是镜像内得路径如 /usr/local/tomcat/webapps/ROOT

vi Dockerfile

FROM tomcat
COPY shop.zip /usr/local/tomcat/webapps/ROOT
RUN unzip shop.zip

WORKDIR 为工作目录,如果目录不存在,WORKDIR会帮你建立目录
每一个指令都会构建一个分层
每一个RUN都是启动一个容器,即使失败了,也启动了,会导致直接删除了不了镜像,所以需要先回去把该容器删除再删镜像 正常情况下,--rm 会自动删除

vi Dockerfile

FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
COPY shop.zip .
RUN unzip shop.zip

:wq!

build -t shop .

解压缩之后还需要一个命令
vi Dockerfile

FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *         #删除ROOT目录下所有内容
COPY shop.zip .
RUN unzip shop.zip
RUN rm -fr shop.zip
WORKDIR /usr/local/tomcat  #切换到镜像本身的工作空间

:wq!

build -t shop .

ADD

ADD指令和COPY的格式和性质基本一致 ADD指令会自动解压缩这个文件到<目标路径>中去

vi Dockerfile

FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *         
ADD shop.tar.gz .
WORKDIR /usr/local/tomcat

:wq!

docker build -t shop .
可以看到他是把整个目录都打包了体积变的越来越大

docker run -it --rm shop bash

cd webapps/
cd ROOT/
ls -al
可以看到自动解压缩了,并且原来的tar包也被删除了
但是某些情况下,如果我们真的是希望复制个压缩文件进去,而不解压缩,这时就不可以使用ADD命令了。

接下来是修改端口号为80
docker image prune

docker run -p 8080:8080 tomcat

-p 的意思是 port端口

EXPOSE <端口1> [<端口2>...]
EXPOSE指令只是一个声明,运行时并不会因为这个声明应用就会开启这个端口的服务。
在dockerfile中写入这样的声明有两个好处,一个是帮助进行使用者理解这个镜像服务的守护端口,以方便配置映射;另一个好处是在运行时使用随机端口映射时,也就是
docker run -P时,会自动随机映射EXPOSE的端口

EXPOSE 8080:8080 暴露端口号

** CMD [参数2,参数2...]**
一个容器就是一个进程,一个程序
设置脚本时 设置参数的占位符 如$1、$2

test.sh
SET PATH=$1

test.sh /usr/local/tomcat
其中/usr/local/tomcat就是路径传入的参数
如传入三个参数 catalina.sh run stop restart成功的话, 则在catalina.sh中是有三个占位符的

docker build -t 镜像名称 .
构建实际上是打包本目录文件到服务端去构建然后返回响应内容
镜像上下文-》指的是打包后到docker server中解压后得目录(而不是宿主机得目录)

原文地址:https://www.cnblogs.com/cgy-home/p/11203669.html