在这篇文章中,我们将带领您了解mssql-server-windows-expressDocker容器立即停止的全貌,包括docker容器停止再启动内容会不会消失的相关情况。同时,我们还将为您介绍有关
在这篇文章中,我们将带领您了解mssql-server-windows-express Docker 容器立即停止的全貌,包括docker 容器停止再启动 内容会不会消失的相关情况。同时,我们还将为您介绍有关Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、Docker mssql-server-linux:如何在构建期间启动.sql文件(来自Dockerfile)、Docker 设置中的 .Net Core 3.1 MSSQL 后端:Docker-compose up 产生连接失败、Docker:SLF4J-Error with Docker + Confluence-Server + MySQL - “docker run”有效,“docker-compose up”无效的知识,以帮助您更好地理解这个主题。
本文目录一览:- mssql-server-windows-express Docker 容器立即停止(docker 容器停止再启动 内容会不会消失)
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
- Docker mssql-server-linux:如何在构建期间启动.sql文件(来自Dockerfile)
- Docker 设置中的 .Net Core 3.1 MSSQL 后端:Docker-compose up 产生连接失败
- Docker:SLF4J-Error with Docker + Confluence-Server + MySQL - “docker run”有效,“docker-compose up”无效
mssql-server-windows-express Docker 容器立即停止(docker 容器停止再启动 内容会不会消失)
如何解决mssql-server-windows-express Docker 容器立即停止
我正在尝试在 Docker 容器中运行 sql Server Express。
当我运行 docker container run -d -P my-db:v1
时,它立即停止。
Docker 文件:
# escape=`
FROM microsoft/mssql-server-windows-express
ENV ACCEPT_EULA="Y" `
DATA_PATH="C:\\data" `
sa_password="mypw"
VOLUME ${DATA_PATH}
workdir C:\\folder1
当我删除最后的 workdir
行时,容器会继续运行。
当包含 workdir
行并运行容器时,Docker Desktop 显示:
.\\start : The term ''.\\start'' is not recognized as the name of a cmdlet,function,script file,or operable program. Check the spelling of the name,or
if a path was included,verify that the path is correct and try again.
At line:1 char:76
+ ... e = ''Stop''; $Progresspreference = ''SilentlyContinue''; .\\start -sa_pas ...
+ ~~~~~~~
+ CategoryInfo : ObjectNotFound: (.\\start:String) [],ParentConta
insErrorRecordException
+ FullyQualifiedErrorId : CommandNotFoundException
当我检查容器时,它显示了看起来没问题的启动命令:
"Path": "powershell","Args": [
"-Command","$ErrorActionPreference = ''Stop''; $Progresspreference = ''SilentlyContinue'';",".\\\\start -sa_password $env:sa_password -ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs \\\\\\"$env:attach_dbs\\\\\\" -Verbose"
]
解决方法
CMD .\\start
要求 start.ps1
脚本位于 WORKDIR
目录中。源图像的 WORKDIR
设置为根目录 (C:),脚本位于该目录 (C:\\Start.ps1) 中。
既然您已将 WORKDIR
更改为 C:\\folder1),您需要在 docker 文件中指定新的 CMD 或在运行时覆盖该值。 Dockerfile 示例:
CMD C:\\start.ps1 -sa_password $env:sa_password -attach_dbs \\"$env:attach_dbs\\" -Verbose
Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run
/docker build
?
Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。
为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。
我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run
命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build
将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?
答案下面揭晓。
一、原理说明:/var/run/docker.sock
Docker 采取的是 Client/Server 架构,我们常用的 docker xxx
命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。
我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service
来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service
,能看到有这样一条语句:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock
)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。
因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。
要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".
二、示例
在容器内部使用宿主机的 docker,方法有二:
- 命令行方式:将
/usr/bin/docker
映射进容器内部,然后直接在容器内部使用这个命令行工具docker
- 需要的时候,也可以将
/etc/docker
文件夹映射到容器内,这样容器内的docker
命令行工具也会使用与宿主机同样的配置。
- 需要的时候,也可以将
- 编程方式:在容器内部以编程的方式使用 docker
- 通过 python 使用 docker: 在 Dockerfile 中通过
pip install docker
将 docker client 安装到镜像中来使用
- 通过 python 使用 docker: 在 Dockerfile 中通过
容器的启动方式也有两种,如下:
1. 直接通过 docker 命令启动
示例命令如下:
docker run --name <name> \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--user root \
<image-name>:<tag>
**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock
的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。
2. 使用 docker-compose 启动
docker-compose.yml 文件内容如下:
version: ''3.3''
services:
jenkins-master:
image: jenkinsci/blueocean:latest
container_name: jenkins-master
environment:
- TZ=Asia/Shanghai # 时区
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home # 将容器中的数据映射到宿主机
- /usr/bin/docker:/usr/bin/docker # 为容器内部提供 docker 命令行工具(这个随意)
- /var/run/docker.sock:/var/run/docker.sock # 容器内部通过 unix socket 使用宿主机 docker engine
user: root # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
restart: always
然后通过 docker-compose up -d
即可后台启动容器。
Docker 中的 uid 与 gid
通过上面的操作,我们在容器内执行 docker ps
时,还是很可能会遇到一个问题:权限问题。
如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock
的 onwer 就是 root.
但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock
了。
解决办法:
方法一(不一定有效):在构建镜像时,最后一层添加如下内容:
# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
&& usermod -aG docker <your_user_name>
这样我们的默认用户,就能使用 docker 命令了。
P.S.
999
不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过docker run -u root
启动容器吧。(或者在docker-compose.yml
中添加user: root
属性)
参考
- Docker in Docker - 王柏元
Docker mssql-server-linux:如何在构建期间启动.sql文件(来自Dockerfile)
我正在尝试使用MSsql DB创建自己的Docker镜像以进行开发.它基于microsoft / mssql-server-linux映像.在构建期间,我想将一些.sql文件复制到容器中,然后运行这些脚本(创建数据库模式,表,插入一些数据等).我的Dockerfile看起来像这样:
# use MSsql 2017 image on Ubuntu 16.04
FROM microsoft/mssql-server-linux:2017-latest
# create directory within sql container for database files
RUN mkdir -p /opt/mssql-scripts
# copy the database files from host to container
copY sql/000_create_db.sql /opt/mssql-scripts
# set environment variables
ENV MSsql_SA_PASSWORD=P@ssw0rd
ENV ACCEPT_EULA=Y
# run initial scripts
RUN /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql
在我看来,000_create_db.sql的内容并不重要.
真正的问题是当我尝试使用命令docker build -t demo构建这个Dockerfile时.我总是得到这些错误:
sqlcmd: Error: Microsoft ODBC Driver 13 for sql Server : Login timeout expired.
sqlcmd: Error: Microsoft ODBC Driver 13 for sql Server : TCP Provider: Error code 0x2749.
sqlcmd: Error: Microsoft ODBC Driver 13 for sql Server : A network-related or instance-specific error has occurred while establishing a connection to sql Server. Server is not found or not accessible. Check if instance name is correct and if sql Server is configured to allow remote connections. For more information see sql Server Books Online..
但是当我删除最后一个命令(运行初始脚本)时,构建并运行图像,并调用相同的命令:
docker build -t demo .
docker run -p 1433:1433 --name mssql -d demo
docker exec -it mssql "bash"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql
一切都进展顺利.为什么我不能从Dockefile运行脚本?
RUN /opt/mssql/bin/sqlservr --accept-eula & sleep 10 \
&& /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql \
&& pkill sqlservr
Docker 设置中的 .Net Core 3.1 MSSQL 后端:Docker-compose up 产生连接失败
如何解决Docker 设置中的 .Net Core 3.1 MSSQL 后端:Docker-compose up 产生连接失败
docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "8000:80"
container_name: web_application
depends_on:
- medicalmgr
medicalmgr:
image: "mcr.microsoft.com/mssql/server:2019-latest"
environment:
SA_PASSWORD: Pw@mm2021
ACCEPT_EULA: Y
ports:
- "1433:1433"
container_name: mmm_mmsql_2019
dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
workdir /app
copY . .
RUN dotnet restore && \\
dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
workdir /app
copY --from=build-env /app/out .
ENTRYPOINT ["dotnet","MedicalManager.dll"]
Startup.cs 的
public void CofigureServices(..){
....
var server = Configuration["DBServer"] ?? "medicalmgr";
var port = Configuration["DBPort"] ?? "1433";
var user = Configuration["DBUser"] ?? "SA";
var password = Configuration["DBPassword"] ?? "Pw@mm2021";
var database = Configuration["Database"] ?? "MedicalManager";
//var connectionStr = $"Server={server},{port};Initial Catalog={database};User ID=
//{user};Password={password}";
var connectionStr =
@"Server=medicalmgr;Database=MedicalManager;User=sa;Password=Pw@mm2021;";
services.AddDbContext<MedicalManagerDBContext>(
options => options.UsesqlServer(connectionStr)
);}
错误: 应用程序启动异常:Microsoft.Data.sqlClient.sqlException (0x80131904):建立与 sql Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 sql Server 是否配置为允许远程连接。 (提供程序:TCP 提供程序,错误:40 - 无法打开与 sql Server 的连接)
解决方法
试试这个:
var connectionStr =
@"Data Source=localhost,1433;Initial Catalog=MedicalManager;User Id=sa;Password=Pw@mm2021";
Docker:SLF4J-Error with Docker + Confluence-Server + MySQL - “docker run”有效,“docker-compose up”无效
如何解决Docker:SLF4J-Error with Docker + Confluence-Server + MySQL - “docker run”有效,“docker-compose up”无效
我正在尝试使用 docker-compose.yml
文件在 Windows 10 上的多容器应用程序中使用 Docker 桌面运行与 MysqL 的融合:
services:
confluence:
image: atlassian/confluence-server:7.4.6
build: ./confluence
container_name: confluence
hostname: confluence
volumes:
- ./confluence/data/confluence:/var/atlassian/application-data/confluence # for the confluence.cfg.xml
- ./confluence/lib:/opt/atlassian/confluence/confluence/WEB-INF/lib # for the MysqL driver jar-file
ports:
- 8090:8090
- 8091:8091
MysqL:
image: MysqL:5.7
build: ./MysqL
container_name: MysqL
hostname: MysqL
ports:
- 3306:3306
environment:
- MysqL_ROOT_PASSWORD=root
command: [MysqLd,--character-set-server=utf8,--collation-server=utf8_bin,--default-storage-engine=INNODB,--max_allowed_packet=256M,--innodb_log_file_size=2GB,--transaction-isolation=READ-COMMITTED,--binlog_format=row]
但是,当我使用 docker-compose up --build --force-recreate
运行它时,我得到
INFO [main] org.apache.catalina.core.StandardEngine.startInternal 启动 Servlet 引擎:[Apache Tomcat/9.0.33] 汇合| 处理程序错误 汇合| java.lang.classNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler 汇合|在 ... 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 汇合|在 java.base/java.lang.Thread.run(Thread.java:834) 汇合|严重 [Catalina-utility-1] org.apache.catalina.core.StandardContext.startInternal 一个或多个侦听器无法启动。完整的详细信息将在相应的容器日志文件中找到 汇合|严重 [Catalina-utility-1] org.apache.catalina.core.StandardContext.startInternal Context [] 由于先前的错误启动失败 汇合|信息 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanJars 至少扫描了一个 JAR 以查找 TLD,但不包含 TLD。为该记录器启用调试日志记录以获取已扫描但未在其中找到 TLD 的完整 JAR 列表。在扫描期间跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。 汇合| SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。 汇合| SLF4J:默认为无操作 (nop) 记录器实现 汇合| SLF4J:请参阅 http://www.slf4j.org/codes.html#StaticLoggerBinder 了解更多详情。
当我运行 docker run -v d:/docker/conf-MysqL/confluence/data/confluence:/var/atlassian/application-data/confluence --name="confluence" -p 8090:8090 -p 8091:8091 atlassian/confluence-server:7.4.6
时,我得到
INFO [main] org.apache.catalina.core.StandardEngine.startInternal 启动 Servlet 引擎:[Apache Tomcat/9.0.33] 信息 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanJars 至少扫描了一个 JAR 以查找 TLD,但不包含 TLD。为该记录器启用调试日志记录以获取已扫描但未在其中找到 TLD 的完整 JAR 列表。在扫描期间跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。 SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。 SLF4J:默认为无操作 (nop) 记录器实现 SLF4J:请参阅 http://www.slf4j.org/codes.html#StaticLoggerBinder 了解更多详情。
所以:在这两种情况下,SLF4J 都回退到 nop 模式,但是当我使用 docker-compose up
时,我在 localhost:8090 上收到一个严重错误和 404,因为 Tomcat 无法加载 SLF4J 并且当我使用 {{1} confluence 在 URI 上启动,但随后没有可连接的 DBMS。
有什么想法吗?请帮忙!谢谢!
解决方法
好的,这很简单: 我只需要删除该行
- ./confluence/lib:/opt/atlassian/confluence/confluence/WEB-INF/lib
我最初的理解是,像这样绑定到容器的文件将被添加到文件夹中并可通过文件夹(如链接)访问。 显然,“volumes”将整个路径重新路由到主机,如果容器文件夹中存在文件,则无法再访问它们,而volume则绑定到容器。
希望这对某人有所帮助! :-)
今天的关于mssql-server-windows-express Docker 容器立即停止和docker 容器停止再启动 内容会不会消失的分享已经结束,谢谢您的关注,如果想了解更多关于Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、Docker mssql-server-linux:如何在构建期间启动.sql文件(来自Dockerfile)、Docker 设置中的 .Net Core 3.1 MSSQL 后端:Docker-compose up 产生连接失败、Docker:SLF4J-Error with Docker + Confluence-Server + MySQL - “docker run”有效,“docker-compose up”无效的相关知识,请在本站进行查询。
本文标签: