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的卸载
-
卸载依赖 :
yum remove docker-ce docker-ce
-
删除资源 :. /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.命令小结
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。