windows安装linux部署docker服务全过程
windows安装linux
https://blog.csdn.net/laterstage/article/details/131460688
如果不能查看linux ip信息,需要安装:yum install net-tools.x86_64 -y
linux安装Docker
随着容器技术的兴起,Docker 已经成为了最为流行的容器引擎。它可以快速构建、部署、运行应用程序,并且具有高度的灵活性和可移植性。在 Linux 环境下安装 Docker 非常容易,本文将向您介绍如何在 Linux 上安装 Docker。
步骤1:检查系统是否满足要求
在安装 Docker 之前,我们需要检查当前的 Linux 系统版本是否满足要求。Docker 仅支持 64 位的操作系统,而且内核版本需要在 3.10 或以上。可以通过运行以下命令来检查内核版本:
uname -r
如果您的系统内核版本低于3.10,那么您需要升级到较新的版本。
步骤2:卸载旧版本的 Docker
如果您之前安装过旧版本的 Docker,您需要卸载它们。可以运行以下命令卸载:
sudo apt-get remove docker docker-engine docker.io containerd runc
步骤3:安装 Docker CE
可以使用官方安装脚本来安装 Docker CE。您可以使用以下命令将该脚本下载到您的系统:
curl -fsSL https:``//get.docker.com -o get-docker.sh
运行以下命令以启动 Docker 安装:
sudo sh get-docker.sh
该命令将下载并安装 Docker CE,以及必要的依赖项和工具。安装程序应该自动将 Docker 服务设置为 Linux 系统引导项之一,并启动 Docker 服务。
步骤4:验证 Docker 安装
完成安装后,需要验证 Docker 是否正确安装。可以运行以下命令来验证安装:
sudo docker run hello-world
如果 Docker 正确安装,您将看到以下输出:
Hello from Docker!``This message shows that your installation appears to be working correctly.
步骤5:使用非 root 用户运行 Docker
为了更加安全地使用 Docker,我们建议您不要在 root 用户下运行 Docker。可以创建一个名为 docker 的组,并将非 root 用户添加到该组中,以允许该用户管理 Docker。此外,还可以设置 Docker 守护进程,以仅接受通过 Unix 套接字访问 Docker API的请求。可以运行以下命令来完成操作:
sudo groupadd docker``sudo usermod -aG docker ``$USER``sudo systemctl restart docker
步骤6:使用 Docker
现在,您已经成功将 Docker 安装在 Linux 系统上,并为非 root 用户设置了访问权限。您可以在 Docker Hub 上查找和下载任何容器镜像,并使用以下命令运行容器:
sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
例如,如果您想运行 ubuntu 镜像并在其中运行 bash 终端,则可以使用以下命令:
sudo docker run -it ubuntu /bin/bash
以上命令将启动一个名为 ubuntu 的容器,并在其中启动一个交互式 shell。此时,您可以在其中执行任何命令。
可以使用以下命令列出当前正在运行的容器:
sudo docker ps
如果要停止运行的容器,请使用以下命令:
sudo docker stop [CONTAINER ID]
注意事项
- 在安装 Docker 过程中,安装脚本将添加 Docker apt 仓库,并使用 apt 包管理器安装 Docker。
- Docker 依赖于 cgroups 和 namespace 功能,因此需要启用 Linux 内核中的这些功能才能正常运行。
- 如果您使用的是 Ubuntu 系统,则可以访问 Canonical 的 Docker 安装文档,以获取详细的安装说明和建议。
- 如果您正在使用 Red Hat Enterprise Linux 或 CentOS 等基于 RPM 包管理器的系统,则可以访问 Docker 的 RHEL 安装文档,以获取详细的安装说明和建议。
关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
Docker部署Mysql8.0
1.可能会出现报错:网络不通或者拉取镜像失败
解决方案
(1)查看DNS客户机的配置文件
cat /etc/resolv.conf
出现了报错信息中的ip
猜测应该是这个DNS服务器出现了问题
(2)修改文件
vim /etc/resolv.conf
注释掉:nameserver 192.168.100.2
新增DNS:nameserver 114.114.114.114 nameserver 8.8.8.8
2.拉取镜像
docker pull mysql:8.0.20
3.拉取镜像加速:
使用docker的时候,总是需要去search镜像,使用国外的源下载太慢,还有诸多的限制,无意中发现可以使用阿里云进行加速,实测有用,废话少说,操作如下:
1.打开阿里云控制台,没有的可以用淘宝账号或者支付宝账号直接登录
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
实例:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://8sbrqqbm.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
提醒:阿里云其实也很慢最好用如下推荐:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
安装 docker-compose(redis、mysql 、项目)
安装插件
yum update
yum install docker-compose-plugin# 安装完成后查看版本号
docker compose version
多个服务配置文件(过于专业,可以看下面的案例即可):
# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"
# 定义服务
services:
# 为project定义服务
redis:
# 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
image: redis:5.0.8
# 配置端口 - "宿主机端口:容器暴露端口"
ports:
- "6379:6379"
# 配置容器连接的网络,引用顶级 networks 下的条目(就是最下面配置的networks(一级目录))
networks:
network_name:
# 为单redis创建别名, REDIS_URL标记为redis服务的地址. (不配置aliases也可以, 这样就通过定义的服务名: redis链接)
aliases:
- REDIS_URL
# 挂载
volumes:
- "/docker/redis/conf/redis.conf:/etc/redis/redis.conf"
- "/docker/redis/data:/data"
# 容器总是重新启动
restart: always
# 相当于执行一些命令
command:
redis-server /etc/redis/redis.conf --appendonly yes
# 指定一个自定义容器名称,而不是生成的默认名称。
container_name: redis
# 使用该参数,container内的root拥有真正的root权限。
privileged: true
db:
image: mysql:8.0.33
ports:
- "3306:3306"
# 添加环境变量
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- "/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
- "/docker/mysql/logs:/var/log/mysql"
- "/docker/mysql/data:/var/lib/mysql"
- "/docker/mysql/sql/init.sql:/docker-entrypoint-initdb.d/init.sql"
- "/etc/localtime:/etc/localtime"
networks:
network_name:
aliases:
- MYSQL_URL
restart: always
command: --init-file /docker-entrypoint-initdb.d/init.sql
container_name: mysql
privileged: true
project-name:
# 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
image: 9c7a54a9a43c
# 构建镜像
build:
# 指定项目的地址
context: /root/docker_mysql_redis
# 指定Dockerfile
dockerfile: Dockerfile
ports:
- 8080:8080
# 从文件添加环境变量
env_file:
- /root/environment.env
networks:
network_name:
aliases:
- PROJECT_URL
privileged: true
restart: always
container_name: hello-project
# ........可以继续添加
networks:
# bridge:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信
network_name:
driver: bridge
注意:这些命令需要在 compose的文件目录下执行才可以
# 创建容器并启动 docker compose up
# 停止并删除容器 docker compose down
# 创建容器并后台启动 docker compose up -d
# 容器全部启动 docker compose start
# 仅启动abbix-server服务对应的容器 docker-compose stop zabbix-server
# 容器全部停止 docker compose stop
# 仅停止zabbix-server服务对应的容器 docker compose stop zabbix-server
# 容器全部重启 docker compose restart
# 要注意端口冲突的问题,指定的services不应该有ports属性 docker compose scale zabbix-java-gateway=3
参考示例(重要):
# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"
# 定义服务
services:
# 为project定义服务
redis:
# 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
image: redis:5.0.8
# 配置端口 - "宿主机端口:容器暴露端口"
ports:
- "6379:6379"
# 挂载
volumes:
- "/jcdata/redis5/conf/redis.conf:/etc/redis/redis.conf"
- "/jcdata/redis5/data:/data"
# 容器总是重新启动
restart: always
# 相当于执行一些命令
command:
redis-server /etc/redis/redis.conf --appendonly yes
# 指定一个自定义容器名称,而不是生成的默认名称。
container_name: redis
# 使用该参数,container内的root拥有真正的root权限。
privileged: true
db:
image: mysql:8.0.33
container_name: mysql8
privileged: true
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: csh
MYSQL_PASS: 123456
TZ: Asia/Shanghai
command:
--wait_timeout=28800
--interactive_timeout=28800
--max_connections=1000
--default-authentication-plugin=mysql_native_password
volumes:
- "/jcdata/mysql8/data:/var/lib/mysql"
- "/jcdata/mysql8/config/my.cnf:/etc/mysql/my.cnf"
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# The MySQL Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_log_file_size=256M
max_allowed_packet=64M
max_connections=1024
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8mb4
项目参考案例:
project-name:
image: project-name-iamge
container_name: project-name
restart: always
privileged: true
volumes:
- /data/app/logs/project-name/:/jcdata/logs/
- /etc/localtime:/etc/localtime:ro
environment:
- CFG_NS=1bfa8e1d-6324-4469-8f6d-4ee7b12c13a4
- CFG_ADDR=192.168.0.35
- NACOS_REG=true
ports:
# 对外IP:容器内部ip
- "8084:8080"
迁移 Docker 镜像到另一个 Linux 系统
docker images
docker save -o <文件名>.tar <镜像名称>:<标签> (镜像名称)
docker load -i <文件名>.tar
开启Docker远程访问
[root@docker]# vim /lib/systemd/system/docker.service
#修改execstart这行
execstart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# 重新加载配置文件
[root@idocker]# systemctl daemon-reload
# 重启服务
[root@docker]# systemctl restart docker.service
# 查看端口是否开启
[root@docker]# netstat -nlpt
# 直接curl看是否生效
[root@docker]# curl http://127.0.0.1:2375/info
ideadocker插件
将springboot项目制作成镜像
1.参考文档:https://blog.csdn.net/linLearn/article/details/123426777
2.pom文件
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>com.example.TestDemoApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名-->
<imageName>csh/${project.artifactId}</imageName>
<!--指定标签-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--指定远程 docker api地址-->
<dockerHost>http://192.168.1.5:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.war</include>
</resource>
</resources>
<!-- 以下两行是为了docker push到DockerHub使用的。 -->
<serverId>docker-hub</serverId>
<registryUrl>https://index.docker.io/v1</registryUrl>
</configuration>
</plugin>
</plugins>
</build>
3.根目录下文件 DockerFile
# 指定基础镜像
FROM java:8
# 维护者信息
MAINTAINER csh
# 用于指定持久化目录
VOLUME /tmp
# 将本地文件添加到容器中(这时是打包到本地项目中的target目录下,因为jar有个前缀是target)
ADD target/testdemo-0.0.1-SNAPSHOT.jar testdemo.jar
#ADD target/config config
#COPY target/lib
#ADD target/conf
# 指定于外界交互的端口
EXPOSE 8081
#设置时区 run后面
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 配置容器,使其可执行化
#ENTRYPOINT exec java -Xms512m -Xmx512m -jar /app.jar
ENTRYPOINT exec java $JAVA_OPTS -jar -Duser.timezone=GMT+08 /testdemo.jar
ENV LC_ALL en_US.UTF-8
4.部署镜像到linux
5.linux查看镜像
idea制作镜像的另一种方式
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>com.example.helloworld.HelloworldApplication</mainClass>
</configuration>
</plugin>
<!-- docker插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!-- 远程Docker的地址 -->
<dockerHost>http://192.168.0.126:2375</dockerHost>
<!-- 镜像名称、前缀、项目名 -->
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<baseImage>java:8</baseImage>
<!--作者-->
<maintainer>119@qq.com</maintainer>
<!--命令行-->
<workdir>/ROOT</workdir>
<cmd>["java", "-version"]</cmd>
<entryPoint>["java", "-jar", "${project.artifactId}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 表示的target文件夹 -->
<directory>${project.build.directory}</directory>
<!-- 表示打出来的JAR包-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
命令:
第一步:mvn clean package -DskipTests
第二步:找到docker插件执行 docker build
在linux环境下制作镜像(我一般用这个,如果内网的话可能行不通)
1.上传jar和新建一个Dockerfile文件
2.编辑Dockerfile文件
#FROM java:8
FROM openjdk:8
# 维护者信息
MAINTAINER csh
# 用于指定持久化目录
VOLUME /tmp
# 将本地文件添加到容器中(这时是打包到本地项目中的target目录下,因为jar有个前缀是target)
ADD helloworld-0.0.1-SNAPSHOT.jar helloworld.jar
# 指定于外界交互的端口
EXPOSE 8081
#设置时区 run后面
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 配置容器,使其可执行化
ENTRYPOINT exec java $JAVA_OPTS -jar -Duser.timezone=GMT+08 /helloworld.jar
ENV LC_ALL en_US.UTF-8
3.制作镜像命令
docker build -t helloworld .
第一次制作可能比较时间比较长,需要下载openjdk,耐心等待
本文来自博客园,作者:土木转行的人才,转载请注明原文链接