Archivi tag: Docker

MSSQL Server 2019 on Docker e Full Text Search

Per impostazione predefinita, l’immagine contenuta nel container MSSQL Server 2019 non contiene il servizio Full Text Search. Per poter utilizzare questo servizio bisogna creare un’immagine personalizzata. Per fortuna ci sono immagini già preparate per MSSQL 2019, una di queste è presente qui:

https://schwabencode.com/blog/2019/10/27/MSSQL-Server-2017-Docker-Full-Text-Search

Utilizzando come base di partenza lo script presente al link, basta cambiare semplicemente 2017 in 2019 per avere uno script valido da salvare in un file DOCKERFILE.

## Source: https://github.com/Microsoft/mssql-docker/blob/master/linux/preview/examples/mssql-agent-fts-ha-tools/Dockerfile

# mssql-agent-fts-ha-tools
# Maintainers: Microsoft Corporation (twright-msft on GitHub)
# GitRepo: https://github.com/Microsoft/mssql-docker

# Base OS layer: Latest Ubuntu LTS
FROM ubuntu:16.04

# Install prerequistes since it is needed to get repo config for SQL server
RUN export DEBIAN_FRONTEND=noninteractive && \
    apt-get update && \
    apt-get install -yq curl apt-transport-https && \
    # Get official Microsoft repository configuration
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
    curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2019.list | tee /etc/apt/sources.list.d/mssql-server.list && \
    apt-get update && \
    # Install SQL Server from apt
    apt-get install -y mssql-server && \
    # Install optional packages
    apt-get install -y mssql-server-ha && \
    apt-get install -y mssql-server-fts && \
    # Cleanup the Dockerfile
    apt-get clean && \
    rm -rf /var/lib/apt/lists

# Run SQL Server process
CMD /opt/mssql/bin/sqlservr

Basta creare l’immagine con il comando:

docker build -t gianluigisellitto/mssql-fts:2019-ubuntu .

L#importante è di ricordare quando si avvia il container di fornire il parametro “MSSQL_AGENT_ENABLED=True”, altrimenti l’agent non viene avviato.

Docker e WSL2

Uno dei framework più importanti che si sta imponendo per la distribuzione delle applicazioni è senza dubbio Docker.

Docker, in poche parole, rappresenta l’evoluzione delle Virtual Machine per la distribuzione delle applicazioni in maniera semplice è isolata. Fino a pochi anni fa, il modo più semplice per integrare su una sola macchina più applicazioni era quello di inserire ogni applicazione in una macchina virtuale, in modo da controllare in maniera precisa le interazioni tra le varie applicazioni. Il problema di questo approccio è dato dal fatto di dover avere in ogni macchina virtuale una copia del sistema operativo (SO) da utilizzare per l’applicazione, anche se ridotto all’osso, anche se il semplice Kernel. Con Docker, invece, le applicazioni vengono distribuite in “Containers” che possono essere viste come macchine virtuali senza SO. I servizi necessari a far girare effettivamente l’applicazione sono forniti dal Kernel della macchina host. Il Container Docker in pratica è costituito dall’applicazione vera e propria, più gli strati dell’SO originale per il quale l’applicazione è destinata, per far sembrare all’applicazione di avere a disposizione i servizi dell’SO.

Originariamente i Containers furono sviluppati per Linux, cioè Linux come SO guest. Poi venne la versione per Windows. Le versioni avanzate dei server Docker, possono far girare indifferentemente Containers Linux e Windows. La versione libera Docker per Windows, dedicata agli sviluppatori, permette di sviluppare container Linux o container Windows, ma non allo stesso momento, bisogna passare da un ambiente all’altro. La cosa positiva che una volta avviato un container, ad esempio Linux, si può passare allo sviluppo/debug di un container Windows senza interrompere l’esecuzione del container Linux già avviato. Ad esempio si può avviare un container Linux con SQL Server 2019, per poi passare all’assemblamento di un container Windows di una app che utilizza quel server.

Su Windows, per eseguire i container Linux, viene avviata una VM Linux, che fa da ponte. Una volta era una macchina VirtualBox, ora è una macchina Hyper-V. Ma adesso grazie al rilascio di WSL (Windows Subsystem for Linux) e con il prossimo rilascio di WSL 2, Docker per Windows nella versione beta offre la possibilità di utilizzare WSL per eseguire i container Linux. I risultati sembrano essere incoraggianti, i miglioramenti di velocità si notano a occhio nudo, il container Linux SQL Server 2019 ci mette pochi istanti a partire, contro qualche secondo della macchina Hyper-V. Di contro è più complicato, al momento, settare da Docker le risorse da dedicare al sottosistema Linux, bisogna ricorrere al comando WSL e al file di configurazione .wslconfig.

WSL2 per ora è in fase di test nel Fast ring, ed in fase di installazione di Docker EDGE ci potrebbero essere dei problemi, come descritto qui.

Docker 2.1.7.0 fail to start

Docker on Windows use Hyper-v virtual machine to run Linux Container. But with the new version of Windows there is the WSL (Windows subsystem for Linux). The new version WSL2 currently in beta, is used by the Edge version of Docker to run Linux Container without the virtual machine. This feature is an optional settings from version 2.1.6.0.

But on my development machine, the Edge installer suffer of the same problem of the stable one. The installation seems to complete without problem, but Docker do not works. The problem is the same: wrong version o Syste.Net.http, the installer ends with no problem, the Docker service seems to start but it is in not working state. Also the Doker Desktop client do not start. To solve the problem the solution is the same of the linked article, edit the config file for the service and Docker Desktop. After that you can anjoy Docker on WSL 2.

Docker and System.Net.Http

On my developing machine the installer for Docker for Windows hangs forever. The problem occur from stable version 2.1.0.1 to 2.1.0.5. After a little inspection, i discovered that the installer is waiting for the “Docker Desktop Service”. The log for the service show the error:

…cannot load assembly ‘System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ …

For the library System.Net.Http there are some version problem. If you take this library from Net Framework 4.6.2 (the framework used by Docker for Windows) this library have the Version=4.2.0.0. If you get this library from Nuget you get a library with version <4.2.0.0 (see this for details). So how to solve?

While the installer still hang, waiting for the service to start, follow this steps:

  • go to C:\Program Files\Docker\Docker
  • open the file com.docker.service.config
  • comment out or delete the part:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">      <dependentAssembly>        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />        <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />      </dependentAssembly>    </assemblyBinding>

  • go to Service Console and start the service “com.docker.service” or “Docker Desktop Service” (the name depend on version)

When the service start the installer complete succesfully. Close the installer. The Docker Service Client also do not start for the same reason, the solution is the same, comment out the same binding redirect in the file Docker Desktop.exe.config.

Docker and network on Windows

Developing and testing Docker container can be problematic on Windows 10 if you have different type of container. Suppose that you have one Linux container and one Windows Container that need to communicate, the simple solution to communicate through host ip address (Docker bridge actually is not working in mixed mode); but if your IP is not stable (you move on different network)? Do you need to change the hostname/IP in every configuration file. But there is a more simple solution: Microsoft loopback adatper. If you install this virtual adapter and assign a fixed IP, containers can communicate using this IP, that not change if you change network. Simple solution for speed-up developing process.