为什么要应用docker

Docker是一个用于开发,公布和运行应用程序的开放平台。

在进行软件开发的过程中,咱们时常会面临一个问题:咱们只有一套零碎环境的开发机,然而咱们开发的软件却须要在不同的零碎环境中运行和测试。这就导致咱们须要不同的机器来进行测试,以确保软件在各个环境中运行失常。

docker能够让不同的零碎环境以独立的过程,运行在同一台机器上,让一台机器就能够实现所有零碎环境下的测试和运行。因为docker与虚拟机的原理有着实质的不同,docker无奈运行除本机具备的其余指令集架构(x86-64的机器上无奈运行arm64的程序),肯定水平限度了docker的应用场景,但同时,docker能够以低成本,低资源占用的形式,运行更多的零碎环境。正是这些劣势,让docker在自动化测试,云原生中占据着巩固的位置。

回到本文,作者之所以想写这篇文章,次要是为了介绍如何在MacOS上搭建开发环境。毕竟MacOS与支流Linux发行版仍然有着不少差异,而作为一个软件开发工程师,大部分工夫是须要为Ubuntu,Centos这些Linux发行版开发软件,因而很有必要在MacOS上搭建其余零碎的开发环境。而Docker无疑是十分适合的抉择。闲话少叙,咱们间接进入正题。

应用docker运行其余零碎环境

镜像

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间反对。而 Docker 镜像(Image),就相当于是一个 root 文件系统。

容器

容器的本质是过程,但与间接在宿主执行的过程不同,容器过程运行于属于本人的独立的 命名空间。因而容器能够领有本人的 root 文件系统、本人的网络配置、本人的过程空间,甚至本人的用户 ID 空间。

容器和镜像的相干操作

在理论工作中,咱们往往先拉去镜像,而后生成一个容器实例,而后运行容器实例,进行一系列的工作:

# 查问pull相干帮忙docker pull --help# the basic format is 'docker pull [option] [Docker Registry address[:port]/]repository[:tag]'# examples# pull Ubuntu image# pull the latest Ubuntu. If the Docker Registry address is not provided, the default address is set.docker pull ubuntu# pull Ubuntu 18.04. The repository name is ubuntu, and the tag is 18.04, the Docker Registry address and its port are the default.docker pull ubuntu:18.04# list all available imagedocker image ls# run helpdocker run --help# Run the image ubuntu:18.04 with option '-i' and 't'.# '-i' means run the image with interaction.# '-t' means run the image with terminal.# After exitting the container, delete the container.docker run -it --rm ubuntu:18.04 bash# After exitting the container, leave the container in the system.docker run -it [imagename] bash# or run image in the background.docker run -d [imagename] /bin/sh

当咱们运行完一个镜像之后,也就生成了一个相应的容器(container),这个容器就是能够认为是一个保存起来的零碎状态,咱们对镜像的所有操作产生的影响,都保留在这个容器中。当咱们须要持续工作时,咱们不能运行镜像(这意味着运行一个全新的零碎),而是要启动容器,持续进行工作。

# list all available containersdocker container ls -a#list all running containersdocker container ls# start a containerdocker container start [CONTAINER ID]# enter a container with the terminal.docker exec -it [CONTAINER ID] bash

复用镜像

为什么制作镜像

目前的操作曾经根本笼罩了常见的几种docker操作。

然而仅仅在本人的机器上运行容器未免难以应酬须要复用镜像的场景。

例如,换电脑时,咱们心愿能将搭建好的零碎环境间接移植到新电脑中;老板会心愿新共事间接利用咱们以后的容器,免去搭建开发环境的困扰;咱们搭建的零碎环境有时须要在数以百计的服务器上运行。因而,制作一个镜像,让咱们的制作的零碎环境能够被更多的人应用,无疑是工作中必备的docker技能之一。

如何导出容器

如果咱们只是想把容器移植到新的机器上,大可不必制作镜像,只须要将容器导出为打包文件(例如tar),而后在新的机器上引入就能够了。

# export the containerdocker export [container id] > [output file]# import the container as an imagecat [output file] | docker import - [repository:tag]# Run the image and generate a new container!docker run -it [repository:tag] bash# or run image in the background.docker run -d [imagename] /bin/sh

制作镜像并应用镜像

除了上述办法,也能够间接利用容器制作镜像:

# build a new image using existing container.docker commit [container_id] [new_imagename]docker run -d [new_imagename] /bin/sh

制作好的镜像也能够通过 docker push 命令来将本人的镜像推送到 Docker Hub。

利用vscode连贯到docker

vscode链接docker和连贯近程机器的原理基本一致,都是通过ssh协定进行连贯。

ssh是默认依赖于22号端口TCP协定进行连贯。然而咱们运行中的开发环境是和本机共用网络端口的,因而如果间接连贯到22号端口,只会连贯到本机上,而不能连贯到docker环境中。

好在 Dokcer 为应用程序所发明独立的网络环境,它能让利用从宿主机操作系统的网络环境中独立进去。咱们能够通过端口映射来讲docker环境中的22号端口映射到其余端口。如上面的命令:

docker run -dit -p [port]:22 [image]

接下来就是在docker环境中装置ssh服务,设置明码,并且在vscode中装置相干插件。以Ubuntu为例,在docker环境中执行如下命令:

# install openssh-serverapt-get updateapt-get install openssh-server# set passwordpasswd# command out the line 'PermitRootLogin prohibit-password'# Add the line 'PermitRootLogin yes'vim /etc/ssh/sshd_config# restart the ssh serverservice ssh restart

在本机上安装brew install openssh,在本机vscode上装置Remote-SSH插件,在插件中配置ssh信息(包含ip,用户名,端口等)。