当client 通过pull命令去Docker daemon拉取镜像image时,首先查看images中存不存在对应的镜像, 如果服务端没有, 那么就会去Docker REgistry镜像仓库中拉取一个image镜像到本地(如果仓库中没有,那么通过命令buid创建一个镜像),然后通过run命令创建容器
先有镜像、再有容器、一个镜像可以运行为多个容器;
由于DockerHub是外国网站、很容易访问失败、可配置加速器;
vim daemon.json
{
“registry-mirrors”: [“https://m9r2r2uj.mirror.aliyuncs.com”]
}
systemctl daemon-reload
systemctl restart docker
docker images
docker search java
index : 仓库地址
name: 仓库名+ 名称
starts : 用户点赞数量
official: 是否为官方,ok则代表官方, 放心使用;
UTOMATED : 基于公开的dockerfile支撑的。
docker pull java:8
docker images
docker rmi repository:tag
docker rmi $(docker images -q);
通过docker run创建容器;
docker run -d -p 81:80 nginx
-d选项:表示后台运行
-P选项:随机端口映射
-p选项:指定端口映射,有以下四种格式。
– ip:hostPort:containerPort
– ip::containerPort
– hostPort:containerPort
– containerPort
–net选项:指定网络模式,该选项有以下可选参数:
–net=bridge:默认选项,表示连接到默认的网桥。
–net=host:容器使用宿主机的网络。
–net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
–net=none:不配置该容器的网络,用户可自定义网络配置。
docker ps
参数
-a 查出所有镜像、包括停止的
-f, 用于过滤条件、key-val形式查询
-n, 查出最近几个运行的容器
-l, 查出所有最新版本的容器
-q, 只显示容器ID
-s, 多显示容器大小
[root@centos-7 docker]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
1294465aa995 nginx "/docker-entrypoin..." 2 minutes ago Up 2 minutes 0.0.0.0:90->80/tcp suspicious_brattain 1.09 kB (virtual 141 MB)
b3f28f833918 nginx "/docker-entrypoin..." 17 hours ago Up 17 hours 0.0.0.0:91->80/tcp loving_swanson 1.09 kB (virtual 141 MB)
[root@centos-7 docker]# docker ps -q
1294465aa995
b3f28f833918
[root@centos-7 docker]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:90->80/tcp suspicious_brattain
[root@centos-7 docker]# docker ps -1
unknown shorthand flag: '1' in -1
See 'docker ps --help'.
[root@centos-7 docker]# docker ps -n 1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:90->80/tcp suspicious_brattain
[root@centos-7 docker]# docker ps -n 2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:90->80/tcp suspicious_brattain
b3f28f833918 nginx "/docker-entrypoin..." 17 hours ago Up 17 hours 0.0.0.0:91->80/tcp loving_swanson
[root@centos-7 docker]# docker ps -f name=tomcat
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos-7 docker]# docker ps -f name=nginx
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos-7 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 6 minutes ago Up 6 minutes 0.0.0.0:90->80/tcp suspicious_brattain
b3f28f833918 nginx "/docker-entrypoin..." 17 hours ago Up 17 hours 0.0.0.0:91->80/tcp loving_swanson
8a20491ddf14 nginx "/docker-entrypoin..." 17 hours ago Exited (0) 17 hours ago fervent_bhaskara
7a2f2b98ab37 registry-zqh/tiku:1.1.0 "java -jar /data/a..." 20 months ago Exited (1) 20 months ago
普通停止: docker stop 容器ID
强制停止: docker kill 容器ID
启动: docker start 容器ID
重启: docker restart 容器ID
删除已经停止的容器: docker rm 容器ID
删除正在运行的容器: docker rm -f 容器ID
docker logs IMAGE_ID
docker exec -it IMAGE_ID /bin/bash
apt-get update
apt-get install vim #安装vim
apt-get install iputils-ping #安装ping
apt-get install net-tools #安装ifconfig
docker inspect IMAGE_ID
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节
先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页
FROM nginx
RUN echo 'This is zqh Nginx!!!
' > /usr/share/nginx/html/index.html
docker build -t zqh:tuling .
docker run -d -p 101:80 nginx:zqh
ADD <src> <dest>
COPY
拷贝文件,和ADD命令类似,但不支持URL和压缩包
CMD
EXPOSE
声明容器在运行时对外提供的服务端口
WORKDIR
指定容器工作路径
ENV
指定容器环境变量
ENTRYPINT
容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。
USER
该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令
VOLUME
指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME[“/data”]。
基于Eureka构建一个镜像、也可以自己打包一个SpringBoot应用;
# 基于哪个镜像
From java:8
# 复制文件到容器
ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
有很多应用的数据是不可丢失的、例如Mysql、Redis;若是不设置挂载点、当容器关机后、数据就丢失了、导致生产事故; 而Docker通过设置挂载点、将容器的数据同步到宿主机的目录下、当容器重启时、可宿主机数据同步会容器中;
docker run -d -p 8761:8761 -v /log:/container-log microservice-eureka-server:0.0.1
Dockerfile中设置了${JAVA_OPTS}参数、即运行时、执行JAVA_OPTS参数可指定服务运行参数
# --cap-add=SYS_PTRACE 这个参数是让docker能支持在容器里能执行jdk自带类似jinfo,jmap这些命令,如果不需要在容器里执行这些命令可以不加
docker run -e JAVA_OPTS='-Xms1028M -Xmx1028M -Xmn512M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M' --cap-add=SYS_PTRACE -d -p 8761:8761 microservice-eureka-server:0.0.1
我们制作好了微服务镜像,一般需要发布到镜像仓库供别人使用,我们可以选择自建镜像仓库,也可以直接使用docker官方镜像仓库,这里我们选择docker官方镜像仓库:https://hub.docker.com/
[root@centos-7 myapp]# 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 (yaoyaochengxian):
Password:
Login Succeeded
docker tag microservice-eureka-server:0.0.1 yaoyaochengxian/microservice-eureka-server
docker push yaoyaochengxian/microservice-eureka-server