Docker安装及操作说明

1. Docker概述

(1)容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

(2)Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/

2. 虚拟化技术和容器化技术

(1)虚拟化技术特点:硬件基础上的隔离技术。

(2)容器化技术:操作系统之上的隔离技术。

3. Docker的基本组成

(1)镜像( image ) :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

(2)容器( container ) :
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统

(3)仓库( repository ) :
仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub (默认是国外的)

4. Docker的安装

#!/bin/bash
# 移除掉旧的版本
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 rm -rf /var/lib/docker

#  安装依赖包
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

# 添加源,使用了阿里云镜像
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 配置缓存
sudo yum makecache fast

# 安装最新稳定版本的docker
sudo yum install -y docker-ce

# 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF

# 启动docker引擎并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker

# 配置当前用户对docker的执行权限
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker

5. Docker的卸载

  1. 卸载依赖

    yum remove docker-ce docker-ce
    
  2. 删除资源 :. /var/lib/docker是docker的默认工作路径

    rm -rf /var/lib/docker
    

6. Docker常用命令

10.1 基础命令

docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)
docker COMMAND --help

命令的帮助文档地址:

10.2 镜像命令

1.docker images 查看本地主机的所有镜像

[root@xiaodong ~]# docker images

2.docker search 搜索镜像

[root@xiaodong ~]# docker search mysql 

3.docker pull 镜像名[:tag] 下载镜像

[root@xiaodong ~] # docker pull mysql:5.7 

4.docker rmi 删除镜像

1.删除指定的镜像id
[root@xiaodong~]# docker rmi -f  镜像id

2.删除多个镜像id
[root@xiaodong~]# docker rmi -f  	镜像id 镜像id 镜像id

3.删除全部的镜像id
[root@xiaodong ~]# docker rmi -f  $(docker images -aq)

10.3 容器命令

1.运行容器(run)

docker run  [可选参数]  image 

# 参数说明 
--name="名字"         指定容器名字 
-d                    后台方式运行 
-it                   使用交互方式运行,进入容器查看内容 
-p                    指定容器的端口
[root@xiaodong ~]# docker run -it centos /bin/bash
[root@centosid /]# ls      
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

2.退出容器 (exit)

# exit 停止并退出容器(后台方式运行则仅退出)
# Ctrl+P+Q  不停止容器退出
[root@xiaodong /]# exit
exit
[root@xiaodong~]#

3.查看容器(ps)

docker ps  # 列出当前正在运行的容器
-a   # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q   # 只显示容器的编号
[root@xiaodong ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@xiaodong ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                PORTS         
bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago   
bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             
cf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               

4.删除容器 (rm)

docker rm 容器id                    #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)       #删除所有的容器
docker ps -a -q|xargs docker rm     #删除所有的容器

5.启动和停止容器

docker start 容器id          #启动容器
docker restart 容器id        #重启容器
docker stop 容器id           #停止当前运行的容器
docker kill 容器id           #强制停止当前容器

6. 日志查看

docker logs -tf 容器id
docker logs --tail number 容器id   #num为要显示的日志条数 
#docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
[root@xiaodong ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"

7. 查看容器进程

[root@xiaodong ~]# docker top c703b5b1911f
UID      PID       PPID       C        STIME    TTY     TIME          CMD
root     11156     11135      0        11:31     ?    00:00:00      /bin/sh -c while true;do echo hi;sleep 5;done
root     11886     11156      0        11:43     ?    00:00:00      /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5

8.进入当前容器

  • docker exec 进入容器后开启一个新的终端,可以在里面操作
  • docker attach 进入容器正在执行的终端,不会启动新的进程
[root@xiaodong ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c703b5b1911f /]# ps -ef      
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:31 ?        00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root       279     0  0 03:54 pts/0    00:00:00 /bin/bash
root       315     1  0 03:56 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root       316   279  0 03:56 pts/0    00:00:00 ps -ef	
[root@xiaodong ~]# docker attach c703b5b1911f

9.拷贝操作

  • 拷贝容器的文件到主机中
docker cp 容器id:容器内路径  目的主机路径
  • 拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# cd home
[root@c703b5b1911f home]# ls
# touch 新建文件
[root@c703b5b1911f home]# touch test.java
[root@c703b5b1911f home]# ls
test.java
[root@c703b5b1911f home]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   35 minutes ago   Up 35 minutes             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home
[root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home
hai  pan  test.java

10.命令小结

img

7. 图形化管理工具Portaniner安装

[root@localhost conf]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

8.提交镜像

使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG]  
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker commit -m="add webapps" -a="Ethan" 2a3bf3eaa2e4 mytomcat:1.0 

9.Nginx部署

1.pull nginx镜像

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull nginx 
Using default tag: latest
latest: Pulling from library/nginx
6ec7b7d162b2: Already exists 
cb420a90068e: Pull complete 
2766c0bf2b07: Pull complete 
e05167b6a99d: Pull complete 
70ac9d795e79: Pull complete 
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images;
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        5.7       f07dfa83b528   5 days ago    448MB
nginx        latest    ae2feff98a0c   11 days ago   133MB
centos       latest    300e315adb2f   2 weeks ago   209MB

2.nginx运行

docker run -d --name nginx01 -p 3334:80 nginx 
-d 后台运行 
--name 给容器命名 
-p 3334:80 将宿主机的端口3334映射到该容器的80端口 
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it nginx01 /bin/bash
Error: No such container: nginx01
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d --name nginx01 -p 3334:80 nginx
20c896637ff5de8be835797109d62ee2465e28d9d716be5a8d550ef7d547fcf5
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS           
20c896637ff5   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:3334->80/tcp  

3.配置文件

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it nginx01 /bin/bash
root@20c896637ff5:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@20c896637ff5:/# cd /etc/nginx
root@20c896637ff5:/etc/nginx# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params	uwsgi_params  win-utf

4.访问测试

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
20c896637ff5   nginx     "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes   0.0.0.0:3334->80/tcp   nginx01
[root@iZwz99sm8v95sckz8bd2c4Z ~]# curl localhost:3334
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

5.安装vim

先同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

apt-get update 

我们使用Nginx往往需要编写配置文件,但是Nginx官方镜像没有安装vim,需要我们手动进行安装。

apt-get install vim 

更新完毕再安装即可。我们修改了配置文件,只要重新启动容器docker restart 容器id,改动就可以生效了。

解决vim在终端不能复制的问题:在vim 中输入 :set mouse=r。

启动项目并设置数据卷,为避免nginx因为修改配置文件导致的错误而无法启动容器,我们可以通过cp命令覆盖配置文件,但是设置数据卷会更为方便。启动Nginx容器的同时设置数据卷的命令:

docker run --name my_nginx -d -p 80:80  
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
-v /data/nginx/log:/var/log/nginx 
-v /data/nginx/html:/usr/share/nginx/html/nginx
第一个-v:挂载nginx的主配置文件,以方便在宿主机上直接修改容器的配置文件
第二个-v:挂载容器内nginx的日志,容器运行起来之后,可以直接在宿主机的这个目录中查看nginx日志
第三个-v:挂载静态页面目录

10.Tomcat部署

(1)下载并运行

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull tomcat 

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -p 3335:8080 --name tomcat01 tomcat 

(2)进入容器

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it tomcat01 /bin/bash 

(3)访问测试

[root@iZwz99sm8v95sckz8bd2c4Z ~]# curl localhost:3335

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/9.0.41</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

​```
<body>
    <div id="wrapper">
        <div id="navigation" class="curved container">
            <span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
            <span id="nav-hosts"><a href="/docs/">Documentation</a></span>
            <span id="nav-config"><a href="/docs/config/">Configuration</a></span>
            <span id="nav-examples"><a href="/examples/">Examples</a></span>
            <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
            <span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
            <span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
            <br class="separator" />
        </div>
​```

11.MySQL部署

(1)下载并运行

# 拉取并运行容器
docker run -d --name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 默认账号root 用户的密码。

(2)进入容器查看MySQL服务

docker exec -it 9b3aad6819ff /bin/bash
mysql -h localhost -u root -p

12.宿主机与容器间数据卷

Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用数据卷。(在宿主机中新建一个文件与docker容器中需要记录文件关联)

12.1 数据卷创建

12.1.1数据卷创建方法一:

(1)简单使用

docker run -it -v 主机目录:容器目录

(2)查看容器数据卷和其他配置信息信息

docker inspect 容器id 

(3)MySQL容器建立数据卷同步数据

docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

12.1.2数据卷创建方法二:

(1)创建数据卷

docker volume create my-vol

(2)查看所有的数据卷

$ docker volume ls
local my-vol

(3)查看指定数据卷的信息

$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]

(4)删除数据卷 docker volume rm ...

$ docker volume rm my-vol

(5)删除容器之时删除相关的卷

$ docker rm -v ...

(6)无主的数据卷可能会占据很多空间,要清理请使用以下命令

$ docker volume prune 

(7)使用 --mount指定创建数据卷

$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system

上面的命令挂载主机的/src/webapp目录到容器的/opt/webapp目录。用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

12.2 具名挂载和匿名挂载

(1)匿名挂载

匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER    VOLUME NAME
local     0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26

(2)具名挂载

具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls命令可以查看当前数据卷的目录情况。

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx 
查看指定的数据卷信息的命令:docker volume inspect数据卷名称

(3)匿名挂载、具名挂载、指定路径挂载的命令区别

-v  容器内路径             #匿名挂载
-v  卷名:容器内路径         #具名挂载
-v  /宿主机路径:容器内路径  #指定路径挂载

指定数据卷映射的相关参数:
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

12.3Dockerfile中创建数据卷

我们可以在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。

下面使用Dockerfile构建一个新的镜像,dockerfile01文件的内容,匿名挂载了volume01和volume02两个目录。

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----" 

CMD /bin/bash 
# docker build -f /home/docker-test-volume/dockerfile01 -t ethan/centos:1.0 .
# docker [root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
ethan/centos          1.0       1df90e6fd790   13 minutes ago   209MB
可以看到自动挂载的数据卷目录。下面查看对应宿主机的数据卷目录,可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。
 "Mounts": [
            {
                "Type": "volume",
                "Name": "c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc",
                "Source": "/var/lib/docker/volumes/c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f",
                "Source": "/var/lib/docker/volumes/1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]

13.容器与容器间数据卷

在这里插入图片描述

首先启动容器1,volume01、volume02为挂载目录。 
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it --name cnetos01 ethan/centos:1.0 
[root@731d53b8c3d5 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02

然后启动容器2,通过参数--volumes-from,设置容器2和容器1建立数据卷挂载关系。
[root@iZwz99sm8v95sckz8bd2c4Z /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0

首先在容器2中的volume01中添加文件,然后就可以看到容器1的文件也会添加上了
[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java

13.Dockerfile镜像制作

Dockerfile是用来构建Docker镜像的文本文件,也可以说是命令参数脚本。docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

13.1.Docker镜像发布的步骤

  • 编写一个dockerfile文件
  • docker build 构建成为一个镜像
  • docker run 镜像
  • docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)

13.2.Dockerfile指令说明

  • Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
指令说明
FROM指定基础镜像
MAINTAINER镜像是谁写的,姓名+邮箱
RUN镜像构建的时候需要运行的命令
ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
WORKDIR镜像的工作目录
VOLUME挂载的目录
EXPOSE保留端口配置
CMD指定这个容器启动的时候要运行的命令(只有最后一个会生效)
EMTRYPOINT指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令
COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
ENV构建的时候设置环境变量

Dockerfile指令的详细语法解释:Dockerfile文件详解

Dockerfile指令介绍的官方文档:https://docs.docker.com/engine/reference/builder/

13.3制作Centos镜像

通过编写Dockerfile文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在/home/dockfile 目录下新建文件mydockerfile-centos。然后使用上述指令编写该文件。

[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER ethan<1258398543@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
# docker build -f mydockerfile-centos -t mycentos:1.0 .

逐行解释该Dockerfile文件的指令:

  • FROM centos:该image文件继承官方的centos,后面加冒号如centos:7,用于指定镜像的版本
  • ENV MYPATH /usr/local:设置环境变量MYPATH ,后面有用到
  • WORKDIR $MYPATH:直接使用上面设置的环境变量,指定/usr/local为工作目录
  • RUN yum -y install vim和RUN yum -y install net-tools:在/usr/local目录下,运行yum -y install vim和yum -y install net-tools命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中
  • EXPOSE 80:将容器80端口暴露出来,允许外部连接这个端口
  • CMD:指定容器启动的时候运行命令通过这个dockerfile构建镜像,构建镜像命令:docker build -f dockerfile文件路径 -t 镜像名[:版本号] .(这里有个小点.)
  • 上面命令中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run -it mycentos:1.0 

13.4.RUN CMD ENTRYPOINT

  • RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
  • 注意:指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令
  • CMD :指定容器启动的时候要运行的命令,只有最后一个会生效,不可追加命令。
  • ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加

14.发布镜像到DockerHub

  • 1.登录https://hub.docker.com/ DockerHub官网进行注册
  • 2.进行登录,docker login -u 用户名
  • 3.使用docker push命令推送镜像到DockerHub上的仓库
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker images
REPOSITORY                TAG       IMAGE ID       CREATED             SIZE
diytomcat                 1.0       0975df661526   About an hour ago   688MB
ethanhuang824/diytomcat   1.0       0975df661526   About an hour ago   688MB

[root@iZwz99sm8v95sckz8bd2c4Z test]# docker push ethanhuang824/diytomcat:1.0 

因为push的时候,镜像名前面需要加上用户名(ethanhuang824是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令docker tag 镜像名 新的镜像名复制出一份镜像重新打个Tag。

15.docker网络组建

了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令

  • CMD :指定容器启动的时候要运行的命令,只有最后一个会生效,不可追加命令。
  • ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加

14.发布镜像到DockerHub

  • 1.登录https://hub.docker.com/ DockerHub官网进行注册
  • 2.进行登录,docker login -u 用户名
  • 3.使用docker push命令推送镜像到DockerHub上的仓库
[root@iZwz99sm8v95sckz8bd2c4Z test]# docker images
REPOSITORY                TAG       IMAGE ID       CREATED             SIZE
diytomcat                 1.0       0975df661526   About an hour ago   688MB
ethanhuang824/diytomcat   1.0       0975df661526   About an hour ago   688MB

[root@iZwz99sm8v95sckz8bd2c4Z test]# docker push ethanhuang824/diytomcat:1.0 

因为push的时候,镜像名前面需要加上用户名(ethanhuang824是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令docker tag 镜像名 新的镜像名复制出一份镜像重新打个Tag。

15.docker网络组建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值