共计 3238 个字符,预计需要花费 9 分钟才能阅读完成。
为什么要应用 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 image
docker image ls
# run help
docker 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 containers
docker container ls -a
#list all running containers
docker container ls
# start a container
docker container start [CONTAINER ID]
# enter a container with the terminal.
docker exec -it [CONTAINER ID] bash
复用镜像
为什么制作镜像
目前的操作曾经根本笼罩了常见的几种 docker 操作。
然而仅仅在本人的机器上运行容器未免难以应酬须要复用镜像的场景。
例如,换电脑时,咱们心愿能将搭建好的零碎环境间接移植到新电脑中;老板会心愿新共事间接利用咱们以后的容器,免去搭建开发环境的困扰;咱们搭建的零碎环境有时须要在数以百计的服务器上运行。因而,制作一个镜像,让咱们的制作的零碎环境能够被更多的人应用,无疑是工作中必备的 docker 技能之一。
如何导出容器
如果咱们只是想把容器移植到新的机器上,大可不必制作镜像,只须要将容器导出为打包文件(例如 tar),而后在新的机器上引入就能够了。
# export the container
docker export [container id] > [output file]
# import the container as an image
cat [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-server
apt-get update
apt-get install openssh-server
# set password
passwd
# command out the line 'PermitRootLogin prohibit-password'
# Add the line 'PermitRootLogin yes'
vim /etc/ssh/sshd_config
# restart the ssh server
service ssh restart
在本机上安装 brew install openssh
,在本机 vscode 上装置 Remote-SSH 插件,在插件中配置 ssh 信息(包含 ip,用户名,端口等)。