The SQL Server DBA’s Guide to Docker Containers Agile Deployment without Infrastructure Lock-in — Edwin M Sarmiento The SQL Server DBA’s Guide to Docker Containers Agile Deployment without Infrastructure Lock-in Edwin M Sarmiento The SQL Server DBA’s Guide to Docker Containers: Agile Deployment without Infrastructure Lock-in Edwin M Sarmiento Ottawa, ON, Canada ISBN-13 (pbk): 978-1-4842-5825-5 ISBN-13 (electronic): 978-1-4842-5826-2 https://doi.org/10.1007/978-1-4842-5826-2 Copyright © 2020 by Edwin M Sarmiento This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or hereafter developed. Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights. While the advice and information in this book are believed to be true and accurate at the date of publication, neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be made. The publisher makes no warranty, express or implied, with respect to the material contained herein. Managing Director, Apress Media LLC: Welmoed Spahr Acquisitions Editor: Jonathan Gennick Development Editor: Laura Berendson Coordinating Editor: Jill Balzano Cover image designed by Freepik (www.freepik.com) Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer- sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation. For information on translations, please e-mail [email protected], or visit http://www.apress.com/ rights-permissions. Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales web page at http://www.apress.com/bulk-sales. Any source code or other supplementary material referenced by the author in this book is available to readers on GitHub via the book’s product page, located at www.apress.com/9781484258255. For more detailed information, please visit http://www.apress.com/source-code. Printed on acid-free paper This book is dedicated to all SQL Server DBAs and IT professionals who, for years, are stuck on the belief that they don’t have what it takes to succeed – that you’re not good enough, not smart enough, not technical enough, not talented enough. It’s about time to let go of those lies and start living the life you were meant to live. This book was written by a person who was told he would not amount to anything. Table of Contents About the Author ���������������������������������������������������������������������������������������������������xiii About the Technical Reviewer ���������������������������������������������������������������������������������xv Acknowledgments �������������������������������������������������������������������������������������������������xvii Introduction ������������������������������������������������������������������������������������������������������������xix Chapter 1: Introduction to Containers ����������������������������������������������������������������������1 The Latest 30-Year-Old Technology �����������������������������������������������������������������������������������������������2 Docker – The Company and the Container Runtime ���������������������������������������������������������������������3 The Case for Containers ����������������������������������������������������������������������������������������������������������������4 Containers vs� Virtualization ����������������������������������������������������������������������������������������������������������4 Microsoft, Containers, and SQL Server on Linux ���������������������������������������������������������������������������7 Summary���������������������������������������������������������������������������������������������������������������������������������������8 Chapter 2: Install and Configure Docker on Windows Server �����������������������������������9 Minimum System Requirements �������������������������������������������������������������������������������������������������10 Enable Containers Feature in Windows Server 2016 ������������������������������������������������������������������11 Download and Install the Docker-Microsoft PackageManagement Provider ������������������������������12 Download and Install the Docker Package ����������������������������������������������������������������������������������13 Verifying the Docker Engine Installation �������������������������������������������������������������������������������������14 Docker Desktop for Windows ������������������������������������������������������������������������������������������������������15 Summary�������������������������������������������������������������������������������������������������������������������������������������18 Chapter 3: Install and Configure Docker on Linux ��������������������������������������������������19 Minimum System Requirements �������������������������������������������������������������������������������������������������20 Basic Linux Commands You Need to Get Started ������������������������������������������������������������������������21 Installing Docker on CentOS Linux ����������������������������������������������������������������������������������������������23 v Table of ConTenTs Update the CentOS System Packages �����������������������������������������������������������������������������������23 Install the Required Dependencies ����������������������������������������������������������������������������������������24 Add the Docker Stable Repository to Your System ����������������������������������������������������������������25 Install Docker CE �������������������������������������������������������������������������������������������������������������������27 Starting the Docker Daemon and Enabling on Startup ����������������������������������������������������������28 Installing Docker on Ubuntu Linux ����������������������������������������������������������������������������������������������29 Update the Ubuntu System Packages �����������������������������������������������������������������������������������29 Install the Required Dependencies for Connecting to a Repository over HTTPS �������������������30 Add the Official GPG Key from Docker �����������������������������������������������������������������������������������31 Add the Docker Stable Repository to Your System ����������������������������������������������������������������32 Install Docker CE �������������������������������������������������������������������������������������������������������������������33 Verifying the Docker Engine Installation �������������������������������������������������������������������������������������34 Getting Rid of sudo? ��������������������������������������������������������������������������������������������������������������������36 Summary�������������������������������������������������������������������������������������������������������������������������������������38 Chapter 4: The Docker Ecosystem ��������������������������������������������������������������������������39 Hello World: Docker Edition ���������������������������������������������������������������������������������������������������������40 How Docker Runs Containers �����������������������������������������������������������������������������������������������������42 The Docker Ecosystem ����������������������������������������������������������������������������������������������������������������44 Docker CLI �����������������������������������������������������������������������������������������������������������������������������44 Docker Daemon���������������������������������������������������������������������������������������������������������������������������45 Docker Commands ����������������������������������������������������������������������������������������������������������������������45 Docker Images and Containers ���������������������������������������������������������������������������������������������������46 Docker Hub ���������������������������������������������������������������������������������������������������������������������������������47 Exploring Docker Hub������������������������������������������������������������������������������������������������������������������49 Docker Image Naming Conventions ��������������������������������������������������������������������������������������������51 Running SQL Server on Windows Containers �����������������������������������������������������������������������������56 Running SQL Server on Linux Containers �����������������������������������������������������������������������������������58 Beginning to Explore Containers and Images �����������������������������������������������������������������������������59 Things to Consider ����������������������������������������������������������������������������������������������������������������������60 Connecting to the SQL Server Instance Remotely ����������������������������������������������������������������������63 vi Table of ConTenTs Lifecycle of a Container ��������������������������������������������������������������������������������������������������������������66 Summary�������������������������������������������������������������������������������������������������������������������������������������67 Chapter 5: Docker Images and Containers �������������������������������������������������������������69 A Quick Review (And Then Some…) �������������������������������������������������������������������������������������������70 Behind the Scenes of Pulling Images �����������������������������������������������������������������������������������������73 Fat Manifest? �������������������������������������������������������������������������������������������������������������������������75 Image Manifest ����������������������������������������������������������������������������������������������������������������������79 Content Digest �����������������������������������������������������������������������������������������������������������������������81 Distribution Hash �������������������������������������������������������������������������������������������������������������������82 Your Docker Host’s Local Filesystem ������������������������������������������������������������������������������������������85 Union Filesystem �������������������������������������������������������������������������������������������������������������������85 Files, Directory Names, and Symbolic Links��������������������������������������������������������������������������85 Stitching Layers: Assembling the Image �������������������������������������������������������������������������������������90 How a Union FileSystem Works ���������������������������������������������������������������������������������������������91 Traversing the Layers ������������������������������������������������������������������������������������������������������������92 The Container Layer ��������������������������������������������������������������������������������������������������������������������97 Summary�������������������������������������������������������������������������������������������������������������������������������������98 Chapter 6: Managing and Administering Containers ����������������������������������������������99 Configuring the Docker Daemon �����������������������������������������������������������������������������������������������100 Working with dockerd����������������������������������������������������������������������������������������������������������101 Working with daemon�json ��������������������������������������������������������������������������������������������������101 Changing the Default Image and Container Directory ���������������������������������������������������������103 Stopping and Restarting the Docker Daemon ���������������������������������������������������������������������������106 Configure the Docker Daemon for Remote Access on CentOS Linux ����������������������������������������106 Configure Remote Access to the Docker Daemon with the systemd Unit File ��������������������107 Protect the Docker Daemon Socket by Configuring Mutual TLS Encryption ������������������������110 Update the daemon�json to Include the Settings for Mutual TLS Encryption ����������������������114 Enable Firewall Port to Allow Traffic to Docker Daemon������������������������������������������������������114 Testing Remote Client Connectivity �������������������������������������������������������������������������������������115 Cleanup �������������������������������������������������������������������������������������������������������������������������������116 vii Table of ConTenTs Configure Docker CLI Bash Completion ������������������������������������������������������������������������������������117 Starting and Stopping Containers ���������������������������������������������������������������������������������������������118 Deleting Containers and Images �����������������������������������������������������������������������������������������������120 Interacting with Running Containers�����������������������������������������������������������������������������������������121 Sharing Files Between Host and Container �������������������������������������������������������������������������������122 Configuring Container Resources ���������������������������������������������������������������������������������������������124 Exploring the Container Logs ����������������������������������������������������������������������������������������������������126 Reviewing the Status of the Docker Daemon ���������������������������������������������������������������������������128 Summary�����������������������������������������������������������������������������������������������������������������������������������130 Chapter 7: Persisting Data ������������������������������������������������������������������������������������133 Stateful vs� Stateless Applications ��������������������������������������������������������������������������������������������134 Containers Are Ephemeral and Immutable��������������������������������������������������������������������������������135 How Cloud Providers Implement Infrastructure- as- a-Service �������������������������������������������������136 Docker Volumes ������������������������������������������������������������������������������������������������������������������������139 Attach Volumes to Containers ���������������������������������������������������������������������������������������������������143 To -v or to --mount ��������������������������������������������������������������������������������������������������������������144 Sharing Volumes Between Containers? �������������������������������������������������������������������������������145 Leveraging Volumes with SQL Server on Containers ����������������������������������������������������������������146 Smart SQL Server In-Place Upgrade �����������������������������������������������������������������������������������������152 Summary�����������������������������������������������������������������������������������������������������������������������������������156 Chapter 8: Working with SQL Server on Linux ������������������������������������������������������157 SQL Server on Linux Architecture ���������������������������������������������������������������������������������������������158 Project Drawbridge ��������������������������������������������������������������������������������������������������������������159 SQLOS and SQLPAL �������������������������������������������������������������������������������������������������������������160 Difference Between SQL Server on Windows vs� Linux ������������������������������������������������������������162 Installing SQL Server on Linux ��������������������������������������������������������������������������������������������������163 Manual Installation ��������������������������������������������������������������������������������������������������������������164 Unattended Installation��������������������������������������������������������������������������������������������������������166 Configuring the Firewall ������������������������������������������������������������������������������������������������������������169 viii Table of ConTenTs A Note on the Linux Firewalls and Docker ��������������������������������������������������������������������������������173 Configuring SQL Server on Linux ����������������������������������������������������������������������������������������������174 Enabling the SQL Server Agent ��������������������������������������������������������������������������������������������176 Configuring Default Database Data and Log Directory ��������������������������������������������������������177 Configuring Default Database Backup Directory �����������������������������������������������������������������177 Enabling Trace Flags ������������������������������������������������������������������������������������������������������������178 Viewing All Instance-Level Configuration Settings ��������������������������������������������������������������179 Working with the Filesystem �����������������������������������������������������������������������������������������������������180 Important Directories in the Linux Filesystem ��������������������������������������������������������������������������181 File Permissions ������������������������������������������������������������������������������������������������������������������������183 Assigning Permissions to Files and Directories ������������������������������������������������������������������������185 Writing a Simple Linux Bash Script �������������������������������������������������������������������������������������������188 Running the Script ���������������������������������������������������������������������������������������������������������������192 Passing Parameters to the Script ����������������������������������������������������������������������������������������193 Adding Conditional Logic in Bash Scripts ����������������������������������������������������������������������������194 Summary�����������������������������������������������������������������������������������������������������������������������������������198 Chapter 9: Creating Custom SQL Server on Windows Container Images ��������������199 Creating Custom Docker Images �����������������������������������������������������������������������������������������������200 Exploring the Dockerfile ������������������������������������������������������������������������������������������������������������202 The File ��������������������������������������������������������������������������������������������������������������������������������203 The FROM Instruction ����������������������������������������������������������������������������������������������������������204 The LABEL Instruction ���������������������������������������������������������������������������������������������������������204 The RUN Instruction �������������������������������������������������������������������������������������������������������������205 The COPY Instruction �����������������������������������������������������������������������������������������������������������206 The ADD Instruction �������������������������������������������������������������������������������������������������������������208 The SHELL Instruction ���������������������������������������������������������������������������������������������������������209 The CMD Instruction ������������������������������������������������������������������������������������������������������������210 The ENTRYPOINT Instruction �����������������������������������������������������������������������������������������������������211 CMD vs� RUN vs� SHELL vs� ENTRYPOINT ����������������������������������������������������������������������������������212 ix Table of ConTenTs The WORKDIR Instruction ����������������������������������������������������������������������������������������������������������213 The ENV Instruction �������������������������������������������������������������������������������������������������������������������213 Using Escape Characters ����������������������������������������������������������������������������������������������������������214 Putting the Pieces Together with a Dockerfile ��������������������������������������������������������������������������215 Build the Custom SQL Server on Windows Image ���������������������������������������������������������������������218 Optimizing the Dockerfile ����������������������������������������������������������������������������������������������������������222 Summary�����������������������������������������������������������������������������������������������������������������������������������227 Chapter 10: Creating Custom SQL Server on Linux Container Images������������������229 Additional Dockerfile Instructions ���������������������������������������������������������������������������������������������229 The EXPOSE Instruction �������������������������������������������������������������������������������������������������������230 The VOLUME Instruction ������������������������������������������������������������������������������������������������������232 The USER Instruction �����������������������������������������������������������������������������������������������������������232 Build the Custom SQL Server on Linux Image ��������������������������������������������������������������������������233 Installing a Specific SQL Server Version ������������������������������������������������������������������������������236 Creating a Custom Image That Runs As Non-root ���������������������������������������������������������������238 Running a Container As Non-root ����������������������������������������������������������������������������������������242 Non-root User and Docker Volumes ������������������������������������������������������������������������������������������247 Optimizing the Dockerfile ����������������������������������������������������������������������������������������������������������250 Running Scripts Inside the Dockerfile ���������������������������������������������������������������������������������������252 Install the SQL Server Command-Line Utilities ��������������������������������������������������������������������252 Write the Bash Script to Check for Backups ������������������������������������������������������������������������253 Run the Bash Script in the Last Instruction �������������������������������������������������������������������������257 Multi-stage Builds ���������������������������������������������������������������������������������������������������������������������259 Docker Compose and YAML Files ����������������������������������������������������������������������������������������������263 Installing Docker Compose ��������������������������������������������������������������������������������������������������263 Creating a YAML File for Multi-container Apps ��������������������������������������������������������������������264 Summary�����������������������������������������������������������������������������������������������������������������������������������268 x