在linux 系统中 centos 系统 docker 基本使用
- 安装docker
- 1、在centos7中安装docker
- 2、Docker:设置ustc镜像源 (不想配课忽略)
- 3、Docker:服务相关命令
- 4、Docker:容器相关命令
- 5、容器的基本命令
- 6、Docker:容器文件拷贝
- 7、Docker:容器目录挂载
- 8、小结Docker的镜像和容器的命令:
- 9、Docker:安装mysql容器:
- 10、Docker:安装tomcat容器
- 11、docker: 安装 java 环境
- 15、Docker:安装Nginx容器
- 16、Docker:安装Redis容器
- 17、Docker:安装Rabbitmq容器
- 18、Docker:安装node容器
- 18、Docker:容器备份与迁移
- 19、Docker:Dockerfile构建镜像
- 20、Docker:registry私服仓库
- 21、总结
安装docker
1、在centos7中安装docker
# 1. yum 包更新到最新
yum update
# 2. 安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 设置yum源为阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安装docker【docker-ce: 社区版,免费;docker-ee:企业版,收费】
yum install docker-ce -y
# 5. 安装后查看docker版本
docker -v
2、Docker:设置ustc镜像源 (不想配课忽略)
# 执行如下命令
mkdir /etc/docker
vi /etc/docker/daemon.json
内容如下
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
或者去阿里云申请国内镜像 申请地址 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
{
"registry-mirrors": [这里填申请到的地址]
}
systemctl daemon-reload
systemctl start docker
3、Docker:服务相关命令
1、基本使用命令
# 启动docker服务
systemctl start docker
# 停止docker服务
systemctl stop docker
# 重启docker服务
systemctl restart docker
# 查看docker服务状态
systemctl status docker
# 设置开机启动docker服务
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker帮助文档
docker --help
2、查看、删除、拉取、搜索镜像
docker images: 查看镜像
docker search: 搜索镜像
docker pull: 拉取/下载镜像
docker rmi: 删除镜像
# 查看镜像可以使用如下命令:
docker images
# 如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称
# 拉取镜像就是从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本 命令如下:
docker pull 镜像名称
# 拉取centos 7
docker pull centos:7
# 拉取centos 最后版本镜像
docker pull centos:latest
# 按照镜像id删除镜像
docker rmi 镜像ID
# 删除所有镜像(谨慎操作)
docker rmi `docker images -q`
4、Docker:容器相关命令
1、查看容器
- 查看正在运行容器: docker ps
- 查看所有容器: docker ps -a
- 查看最后一次运行的容器: docker ps –l
2、创建与运行容器
可以基于已有的镜像来创建容器,创建与运行容器使用命令: docker run
-i: 表示运行容器
-t: 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name: 为创建的容器命名。
-v: 表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d: 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p: 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射。
1、交互式容器
# 先拉取一个镜像;这一步不是每次启动容器都要做的,而是因为前面我们删除了镜像,
# 无镜像可用所以才再拉取一个
docker pull centos:7
# 创建并启动名称为 mycentos7 的交互式容器
# 容器名称 mycentos7
# 镜像名称:TAG (centos:7) 也可以使用镜像id (5e35e350aded)
# /bin/bash: 进入容器命令行
docker run -it --name=mycentos7 centos:7 /bin/bash
1、守互式容器
# 创建并启动守护式容器
# 容器名称: mycentos2
# 镜像名称:TAG (centos:7) 也可以使用镜像id (5e35e350aded)
docker run -di --name=mycentos2 centos:7
# 进入容器:
# docker exec -it container_name (或者 container_id) /bin/bash
# exit退出时,容器不会停止
docker exec -it mycentos2 /bin/bash
5、容器的基本命令
1、停止、启动、重启容器,重启docker 自动启动容器
Flag | Description |
---|---|
no | 默认策略,在容器退出时不重启容器 |
on-failure | 在容器非正常退出时(退出状态非0),才会重启容器 |
on-failure:3 | 指定启动的次数,在容器非正常退出时重启容器,最多重启3次 |
unless-stopped | 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 |
always | 在容器退出时总是重启容器 |
Restart policy细节
使用restart policies时需要注意如下细节:
(1) 容器只有在成功启动后restart policy才能生效。这里的"成功启动"是指容器处于up至少10秒且已经处于docker监管。这是避免没有成功启动的容器陷入restart的死循环。
(2)如果手动(manually)的stop(与前面的explicitly stopped有何区别)一个容器,容器设置的restart policy将会被忽略,除非Docker daemon重启或者容器手动重启。这是避免了另外一种死循环。
(3)restart policies只能用于容器,对于swarm services其restart policies有不通过的配置。
参考: flags related to service restart
# 停止正在运行的容器: docker stop 容器名称|容器ID
docker stop mycentos2
# 启动已运行过的容器: docker start 容器名称|容器ID
docker start mycentos2
# 重启正在运行的容器: docker restart 容器名称|容器ID
docker restart mycentos2
# 设置容器重启策略
docker run -dit --restart always mycentos2
# 如果容器已经创建--设置容器重启策略
docker update --restart=always mycentos2
2、查看容器IP
# 在linux宿主机下查看 mycentos2 的ip
# docker inspect 容器名称(容器ID)
docker inspect mycentos2
3、删除容器
- 删除指定的容器: docker rm 容器名称|容器ID
- 删除所有容器: docker rm `docker ps -a -q`
docker rm mycentos2
# 或者
docker rm 2095a22bee70
# 删除所有容器
docker rm `docker ps -a -q`
6、Docker:容器文件拷贝
将linux宿主机中的文件拷贝到容器内可以使用命令:
# docker cp 需要拷贝的文件或目录 容器名称:容器目录
# 创建一个文件abc.txt
touch abc.txt
# 复制 abc.txt 到 mycentos2 的容器的 / 目录下
docker cp abc.txt mycentos2:/
# 进入mycentos2容器
docker exec -it mycentos2 /bin/bash
# 查看容器 / 目录下文件
ll
将文件从容器内拷贝出来到linux宿主机使用命令:
# docker cp 容器名称:容器目录 需要拷贝的文件或目录
# 进入容器后创建文件aaa.txt
touch aaa.txt
# 退出容器
exit
# 在Linux宿主机器执行复制;将容器mycentos2的/aaa.txt文件复制到 宿主机器的/root目录下
docker cp mycentos2:/aaa.txt /root
7、Docker:容器目录挂载
- 可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
- 创建容器时添加-v参数,后边为宿主机目录:容器目录,例如: docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
# 创建linux宿主机器要挂载的目录
mkdir /usr/local/test
# 创建并启动容器mycentos3
# 并挂载 linux中的/usr/local/test目录到容器的/usr/local/test
# 也就是在 linux中的/usr/local/test中操作相当于对容器相应目录操作
docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
# 在linux下创建文件
touch /usr/local/test/bbb.txt
# 进入容器
docker exec -it mycentos3 /bin/bash
# 在容器中查看目录中是否有对应文件bbb.txt
cd /usr/local/test
ll
注意: 如果你共享的是多级的目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。
8、小结Docker的镜像和容器的命令:
1)Docker镜像命令
docker images: 查看本地所有镜像
docker search: 到中央仓库搜素镜像
docker pull : 拉取镜像
docker rmi: 删除本地镜像
2)Docker容器命令
docker ps -a/-l : 查看容器的状态
docker run -it / -di / -v:创建交互式/守护式容器 ,同时挂载文件/目录
docker start/stop/restart :启动/停止/重启容器
docker rm :删除容器
docker inspect:查看容器的内部IP
docker cp:在宿主机和容器之间拷贝文件
9、Docker:安装mysql容器:
# 拉取MySQL 5.7镜像
docker pull centos/mysql-57-centos7
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
- -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
- -e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用root登录的话,那么其**密码为空**)
# 创建mysql5.7容器
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-57-centos7
# 进入mysql5.7容器
docker exec -it mysql5.7 /bin/bash
# 登录容器里面的mysql
mysql -u root -p
# 查看ip;如果以后要内部连接该mysql,如其他容器中要连接mysql容器的mysql的时候,可以使用如下命令查看IP
docker inspect mysql5.7
使用阿里云需要在阿里云控制台打开3306端口远程访问权限
10、Docker:安装tomcat容器
# 拉取tomcat镜像
docker pull tomcat:8
- 创建容器
# 创建tomcat容器;并挂载了webapps目录 (提供了几种方式创建)
# 方式1
docker run -di --name=tomcat-test -p 6666:8080 \
-v /docker/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8
# 将需要用到的文件复制出来
docker cp tomcat-test:/usr/local/tomcat/conf/ /docker/tomcat
docker cp tomcat-test:/usr/local/tomcat/logs/ /docker/tomcat
docker cp tomcat-test:/usr/local/tomcat/webapps.dist/ /docker/tomcat/
cp -r /docker/tomcat/webapps.dist/ /docker/tomcat/webapps
# 方式2(需要先使用方式1把配置文件 conf/ 里面的东西先复制出来)
docker run -di --name=tomcat -p 9090:8080 \
-v /docker/tomcat/webapps:/usr/local/tomcat/webapps \
-v /docker/tomcat/logs:/usr/local/tomcat/logs \
-v /docker/tomcat/conf:/usr/local/tomcat/conf \
tomcat:8
# 如果需要访问tomcat 面板需要改两个配置文件
# /docker/tomcat/conf/tomcat-users.xml
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
# /docker/tomcat/webapps/manager/META-INF/context.xml
# 将
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
# 改成
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />
# 查看日志
docker logs -f mytomcat
# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
# 执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件中后面添加
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network
测试访问宿主机的端口号为9000的 tomcat。地址:http://宿主机ip:9000,也可以往/user/local/tomcat/webapps下部署应用,然后再访问。
11、docker: 安装 java 环境
目标: 掌握在docker中安装java 容器
操作步骤
-
拉取镜像
# 拉取java 镜像 docker pull java # 创建java 容器 docker run -di --name=java-test -p 9090:9090 java # 或者 docker run -di --name=java-test -p 9090:8080 -v /docker/java/test:/usr/local/java java
``
15、Docker:安装Nginx容器
目标: 掌握在docker中安装nginx容器
操作步骤
# 拉取nginx镜像
docker pull nginx
先要有这些东西
nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
gzip_min_length 1k;
# gzip 压缩级别 1-10
gzip_comp_level 5;
# 进行压缩的文件类型。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
conf.d/default.conf
server {
listen 443 ssl;
server_tokens off;
keepalive_timeout 5;
root /usr/share/nginx/html; #填写您的网站根目录,例如:/usr/local/lighthouse/softwares/wordpress
index index.html index.htm;
server_name xiaoshenren.top; #填写您的证书绑定的域名,例如:cloud.tencent.com
ssl_certificate conf.d/bbbbbbbb.top_server.crt; #填写您的证书文件名称,例如:1_cloud.tencent.com_bundle.crt
ssl_certificate_key conf.d/aaaaaaaa.top_server.key; #填写您的私钥文件名称,例如:2_cloud.tencent.com.key
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 可参考此 SSL 协议进行配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #可按照此加密套件配置,写法遵循 openssl 标准
ssl_prefer_server_ciphers on;
include /etc/nginx/conf.d/host/*.conf;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
listen [::]:80;
server_name xiaoshenren.top;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
include /etc/nginx/conf.d/host/*.conf;
# 将请求转成https
# rewrite ^(.*)$ https://$host$1 permanent;
}
conf.d/host/default.conf
# 静态资源路径
location / {
# 跨域配置
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With, Cache-Control' always;
# 给OPTIONS 添加 200 的返回,是为了处理在发送POST请求时Nginx依然拒绝访问的错误
# 发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。
if ($request_method = OPTIONS ) { return 200; }
root /usr/share/nginx/html;
index index.html index.htm;
}
# node 服务器代理
location /api/ {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:3000/api/;
}
# node 文件上传代理
location /files/ {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:3000/files/;
}
# 外包项目代理
location /project-api/ {
# 跨域配置
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With, Cache-Control' always;
# 给OPTIONS 添加 200 的返回,是为了处理在发送POST请求时Nginx依然拒绝访问的错误
# 发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。
if ($request_method = OPTIONS ) { return 200; }
root /usr/share/nginx/html;
index index.html index.htm;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:8990/;
}
# 外包项目代理
location /project-test-api/ {
# 跨域配置
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With, Cache-Control' always;
# 给OPTIONS 添加 200 的返回,是为了处理在发送POST请求时Nginx依然拒绝访问的错误
# 发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。
if ($request_method = OPTIONS ) { return 200; }
root /usr/share/nginx/html;
index index.html index.htm;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:8991/;
}
#微信功能测试代理
location /wechat-api/ {
# 跨域配置
add_header 'Access-Control-Allow-Methods' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With, Cache-Control' always;
# 给OPTIONS 添加 200 的返回,是为了处理在发送POST请求时Nginx依然拒绝访问的错误
# 发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。
if ($request_method = OPTIONS ) { return 200; }
root /usr/share/nginx/html;
index index.html index.htm;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:9090/;
}
# 创建 nginx 容器
docker run -di --name=mynginx -p 80:80 mynginx
# 创建 nginx 容器
# 方式1
docker run -di --name=nginx-test -p 808:80 -p 4433:443 \
-v /docker/nginx-test/config/conf.d/:/etc/nginx/conf.d/ \
-v /docker/nginx-test/config/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx-test/log/:/var/log/nginx/ \
-v /docker/nginx-test/html/:/usr/share/nginx/html/ \
nginx
docker run -di --name=nginx -p 80:80 -p 443:443 \
-v /docker/nginx/config/conf.d/:/etc/nginx/conf.d/ \
-v /docker/nginx/config/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/log/:/var/log/nginx/ \
-v /docker/nginx/html/:/usr/share/nginx/html/ \
nginx
查看日志
docker logs -f nginx
16、Docker:安装Redis容器
目标: 掌握在docker中安装redis容器
操作步骤
-
拉取镜像
# 拉取redis镜像 docker pull redis
-
创建容器
# 创建redis容器 docker run -di --name=myredis -p 6379:6379 redis # 查看redis日志 docker logs -f myredis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0wa1JTdt-1593486637900)(assets/1574224235332.png)]
-
操作redis容器
# 进入redis容器 docker exec -it myredis /bin/bash # 进入redis安装目录 cd /usr/local/bin # 连接redis ./redis-cli
可以使用redis图形界面客户端工具连接redis,端口也是6379。
17、Docker:安装Rabbitmq容器
目标: 掌握在docker中安装rabbitmq容器
操作步骤
-
拉取镜像
# 拉取rabbitmq镜像 docker pull rabbitmq:management
-
创建容器
# 创建Rabbitmq容器 # 创建容器,rabbitmq需要有映射以下端口: # 15672: web管理的端口 # 5672:(客户端连接端口) docker run -di --name=myrabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management # 查看日志 docker logs -f myrabbit
18、Docker:安装node容器
目标: 掌握在docker中安装node容器
操作步骤
-
拉取镜像
# 拉取rabbitmq镜像 docker pull node
创建容器
docker run --name=node -p 3000:3000 \
-v /docker/node/:/usr/local/node/ \
-di node
# 查看日志
docker logs -f myrabbit
18、Docker:容器备份与迁移
目标: 掌握docker中容器的备份与迁移
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ctj6PGBl-1593486637905)(assets/1574231546282.png)]
主要作用: 就是让配置好的容器,可以得到复用,后面用到得的时候就不需要重新配置。
其中涉及到的命令有:
- docker commit 将容器保存为镜像
- docker save 将镜像备份为tar文件
- docker load 根据tar文件恢复为镜像
操作步骤
-
容器保存为镜像 (使用docker commit命令可以将容器保存为镜像)。
命令格式: docker commit 容器名称 新的镜像名称
# 将容器保存为镜像 # mynginx:容器名称、mynginx:新的镜像名称 docker commit mynginx mynginx
说明: 此镜像的内容就是当前容器的内容,接下来你可以用此镜像再次运行新的容器.
-
镜像备份 (使用docker save命令可以将已有镜像保存为tar文件)
命令格式: docker save –o tar文件名 镜像名
# 保存镜像为文件 docker save -o mynginx.tar mynginx
-
镜像恢复与迁移 (使用docker load命令可以根据tar文件恢复为docker镜像)
命令格式: docker load -i tar文件名
# 停止mynginx容器 docker stop mynginx # 删除mynginx容器 docker rm mynginx # 删除mynginx镜像 docker rmi mynginx # 加载恢复mynginx镜像 docker load -i mynginx.tar # 在镜像恢复之后,基于该镜像再次创建启动容器 docker run -di --name=mynginx -p 80:80 mynginx
总结
- 容器保存镜像: docker commit 容器名称 新的镜像的名称
- 导出镜像: docker save -o 镜像名称.tar 新的镜像的名称
- 导入镜像: docker load -i 镜像名称.tar
19、Docker:Dockerfile构建镜像
目标: 掌握Dockerfile构建镜像
19.1 Dockerfile文件
- 前面的课程中已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像,那该如何做呢?答案是: Dockerfile
- Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。
- Dockerfile文件内容一般分为4部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行的指令
19.2 常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
19.3 构建镜像
# 1、创建目录
mkdir -p /usr/local/dockerjdk8
cd /usr/local/dockerjdk8
# 2、下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
# 3、在/usr/local/dockerjdk8目录下创建Dockerfile文件,文件内容如下:
vi Dockerfile
FROM centos:7
MAINTAINER ITCAST
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 4、执行命令构建镜像;不要忘了后面的那个 .
docker build -t='jdk1.8' .
# 5、查看镜像是否建立完成
docker images
/usr/local/dockerjdk8/Dockerfile 文件中的内容:
说明: 创建文件Dockerfile 这里的D必须大写,不能有任何的偏差。
19.4 镜像创建容器
基于刚刚创建的镜像 jdk1.8 创建并启动容器进行测试
# 创建并启动容器
docker run -it --name=testjdk jdk1.8 /bin/bash
# 在容器中测试jdk是否已经安装
java -version
20、Docker:registry私服仓库
目标: 掌握docker私服仓库搭建
20.1 私有仓库搭建与配置
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
著名Docker私服软件:
1)registry(官方出品)
2)harbor(非官方出品)
私有仓库搭建步骤:
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://宿主机ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json
vi /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将宿主机ip修改为自己宿主 机真实ip
{"insecure-registries":["宿主机ip:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registry
访问: http://192.168.12.132:5000/v2/_catalog
20.2 将镜像上传至私有仓库
# 1、标记镜像为私有仓库的镜像
# 语法: docker tag jdk1.8 宿主机IP:5000/jdk1.8
docker tag jdk1.8 192.168.12.132:5000/jdk1.8
# 2、再次启动私有仓库容器
docker restart registry
# 3、上传标记的镜像到私有仓库
# 语法: docker push 宿主机IP:5000/jdk1.8
docker push 192.168.12.132:5000/jdk1.8
# 4、输入网址查看仓库效果
20.3 从私有仓库拉取镜像
若是在私有仓库所在的服务器上去拉取镜像;那么直接执行如下命令:
# 因为私有仓库所在的服务器上已经存在相关镜像;所以先删除;请指定镜像名,不是id
# 语法: docker rmi 服务器ip:5000/jdk1.8
docker rmi 192.168.12.132:5000/jdk1.8
# 拉取镜像
# 语法: docker pull 服务器ip:5000/jdk1.8
docker pull 192.168.12.132:5000/jdk1.8
#可以通过如下命令查看 docker 的信息;了解到私有仓库地址
docker info
21、总结
1)Docker概念
1.1 Docker是Go语言写的开源的容器引擎。
1.2 Docker 比 VMWare技术更加 小、快、移植方便。
2)Docker命令(重点)
2.1 Docker镜像命令
docker images: 查看本地所有镜像
docker search: 到中央仓库搜素镜像
docker pull : 拉取镜像
docker rmi: 删除本地镜像
2.2 Docker容器命令
docker ps -a/-l : 查看容器的状态
docker run -it / -di / -v:创建交互式/守护式容器 ,同时挂载文件/目录
docker start/stop/restart :启动/停止/重启容器
docker rm :删除容器
docker inspect:查看容器的内部IP
docker cp:在宿主机和容器之间拷贝文件
2.3 使用Docker安装mysql、tomcat、nginx完成spirngboot+vueJS项目部署
3)了解Docker高级用法
3.1 容器的备份与移植
3.2 Dockerfile制作一个Docker镜像
3.3 搭建企业内部的Docker私服