рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрд╢рди рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди рдбреЙрдХрдЯрд░ рд░рд┐рдореЛрдЯ рдПрдкреАрдЖрдИ рд░реАрд╡реЛрдХреЗрд╢рди рд╡реЗрд░рд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди


рдбреЙрдХрд░ рдХреЗ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП, рдбреЙрдХрд░ рдПрдХ рд╡реЗрдм рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ API рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдЕрддреНрдпрдзрд┐рдХ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рд╣реИ), рдпрд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдирд┐рд░рд╕реНрддреАрдХрд░рдг рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЧрдВрднреАрд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред


рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдирд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рд▓рд┐рдирдХреНрд╕ рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВред


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХрд░ рд╣реИ:


{ "hosts": ["tcp://0.0.0.0:2376", "npipe://"], "tlsverify": true, "tlscacert": "C:\\ssl\\ca.cer", "tlscert": "C:\\ssl\\server.cer", "tlskey": "C:\\ssl\\server.key" } 

рдЧреНрд░рд╛рд╣рдХ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрди рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЛ рдирд┐рд░рд╕реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред


рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬреЛ рдПрдХ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдбреЙрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рдПрдЧреА, рдпрд╣ рдкреЛрд░реНрдЯ 2376 рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдбреЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ //./ipe/docker_engine рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред


рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рдПрдХ ASP.NET рдХреЛрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдореАрдкрддрд╛ рдмрдирд╛рдИ:


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░реЙрдХреНрд╕реА рдХреЛрдб
 app.Run(async (context) => { var certificate = context.Connection.ClientCertificate; if (certificate != null) { logger.LogInformation($"Certificate subject: {certificate.Subject}, serial: {certificate.SerialNumber}"); } var handler = new ManagedHandler(async (host, port, cancellationToken) => { var stream = new NamedPipeClientStream(".", "docker_engine", PipeDirection.InOut, PipeOptions.Asynchronous); var dockerStream = new DockerPipeStream(stream); await stream.ConnectAsync(NamedPipeConnectTimeout.Milliseconds, cancellationToken); return dockerStream; }); using (var client = new HttpClient(handler, true)) { var method = new HttpMethod(context.Request.Method); var builder = new UriBuilder("http://dockerengine") { Path = context.Request.Path, Query = context.Request.QueryString.ToUriComponent() }; using (var request = new HttpRequestMessage(method, builder.Uri)) { request.Version = new Version(1, 11); request.Headers.Add("User-Agent", "proxy"); if (method != HttpMethod.Get) { request.Content = new StreamContent(context.Request.Body); request.Content.Headers.ContentType = new MediaTypeHeaderValue(context.Request.ContentType); } using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted)) { context.Response.ContentType = response.Content.Headers.ContentType.ToString(); var output = await response.Content.ReadAsStreamAsync(); await output.CopyToAsync(context.Response.Body, 4096, context.RequestAborted); } } } }); 

рдпрд╣ рдбреЙрдХрд░ рдПрдкреАрдЖрдИ рд╕реЗ рд╕рд░рд▓ GET рдФрд░ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), рдбреЙрдХрд░ WebSocket рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдШрд╛рдд рдпрд╣ рдерд╛ рдХрд┐ рдХреЗрд╕реНрдЯрд░реЗрд▓ рдиреЗ рдбреЙрдХрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЖрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕ рддрдереНрдп рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЛрдИ рдирд┐рдХрд╛рдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЕрдкрдЧреНрд░реЗрдб рд╣реЗрдбрд░ред рд▓реЗрдХрд┐рди рдпрд╣ рдерд╛ред


рдореБрдЭреЗ рдХреЗрд╕реНрдЯреЗрд▓ рдХреЛ рддреНрдпрд╛рдЧрдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ред рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдХ рдкреЛрд░реНрдЯ рдЦреЛрд▓реЗрдВ, рдПрдХ рдЯреАрдПрд▓рдПрд╕ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВ, HTTP рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ, рдбреЙрдХрд░ рдФрд░ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдВрддрд░рд┐рдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдФрд░ рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред


рд╕реВрддреНрд░ рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред


рддреЛ, рдЖрд╡реЗрджрди рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, npine рдлреЗрдВрдХреЗрдВ: // рдЕрдВрджрд░ рдФрд░ рдкреЛрд░реНрдЯ 2376 рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ


рдПрдХ рдбреЙрдХрд░ рдЫрд╡рд┐ рдмрдирд╛рдПрдБ


рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рдорд╛рдгрди рдкреНрд░рд╛рдзрд┐рдХрд░рдг (ca.cer) рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред


рдпрд╣ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЕрдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкреНрд░реЙрдХреНрд╕реА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред


рдореИрдВрдиреЗ рдРрд╕реА рдбреЙрдХрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рд╕реНрд╡рдпрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдВред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Dockerfile рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ, рдЪрд▓рд╛рдПрдБ:


 dotnet publish -c Release -o ..\publish .\DockerTLS\DockerTLS.csproj 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: Dockerfile , publish , ca.cer ред рд╣рдо рдЫрд╡рд┐ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ:


 docker build -t vitaliyorg.azurecr.io/docker/proxy:1809 . docker push vitaliyorg.azurecr.io/docker/proxy:1809 

рдмреЗрд╢рдХ, рдЫрд╡рд┐ рдХрд╛ рдирд╛рдо рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рд▓рд╛рдВрдЪ


рдХрдВрдЯреЗрдирд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ certificate.pfx рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред certificate.pfx рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╛рдЗрд▓ред password.txt ред рд╕рднреА рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐ рдлрд╝реАрдб рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред


рдпрд╣ рд╕рд╛рд░рд╛ рд╕рд╛рдорд╛рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛ: c:\data рдЙрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╣рд╛рдВ рдбреЙрдХрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИред


рдЙрд╕реА рд╕рд░реНрд╡рд░ рдкрд░, рдЪрд▓рд╛рдПрдВ:


 docker run --name docker-proxy -d -v "c:/data:c:/data" -v \\.\pipe\docker_engine:\\.\pipe\docker_engine --restart always -p 2376:2376 vitaliyorg.azurecr.io/docker/proxy:1809 

рд▓реЙрдЧрд┐рдВрдЧ


docker logs рд╕рд╛рде docker logs рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ред рдЖрдк рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдпрд╛рд╕ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рдлрд▓ рд░рд╣реЗред

Source: https://habr.com/ru/post/hi433176/


All Articles