docker是一个基于GoLang的应用容器引擎,它轻量级的沙箱化特性让它在服务器运维方面不可或缺。 docker的优势和特性本篇不再赘述,着重记录Ubuntu环境下docker快速安装和基本使用。
docker引擎本身是跨平台的,在不同Linux、Mac和win环境有不同的实现,而win环境则依托于vbox和hyper-v的虚拟化环境来模拟Linux,本质上还是虚拟机,所以不太建议。而日常需要Android开发的则更不建议win环境,如果是win10环境则需要开启hyper-v,这个win10的这个虚拟化是和Android模拟器冲突的。
安装
docker官方针对Ubuntu环境提供了三套安装方法。
- 配置apt源,使用apt install安装
- 下载.deb安装文件进行安装
- 使用安装脚本进行安装
在实际操作中,前两种方式都遇到了问题,可能会因为依赖或者其他原因造成安装失败, 所以这里仅记录使用第三种方式的安装,这也操作是相对简单的一种方式。
安装脚本其实是一个.sh的文件,它会自动的从官方下载当前环境下对应的最新安装文件,并自动安装docker所需要的各种依赖。
首先下载脚本文件,保存位置不限。
curl -fsSL get.docker.com -o get-docker.sh
得到名为get-docker.sh的脚本文件后使用root权限执行
sudo sh get-docker.sh
之后脚本文件会自动进行各项下载安装,完成安装后会有如下提示
<output truncated>
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
sudo usermod -aG docker your-user
Remember to log out and back in for this to take effect!
WARNING: Adding a user to the "docker" group grants the ability to run
containers which can be used to obtain root privileges on the
docker host.
Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
for more information.
这个提示告诉我们docker命令需要使用root权限来执行,如果想要非root用户使用docker,则需要把用户加入docker用户组,使用命令
sudo usermod -aG docker your-user
之后重新登录让配置生效。
到此为止,docker环境以及安装配置完成。
Hello World
docker为我们提供了hellworld镜像来测试docker安装是否成功。
执行命令
docker run hello-world
这个命令的意思就是字面意思,告诉docker,启动运行一个叫hello-world的镜像,这时候docker会检测本地有没有这个镜像,因为这时候docker是初次安装,所以是没有hello-world镜像的,然后docker会从官方镜像库搜索然后下载,然后启动执行这个镜像。正常情况下,我们得到下面的输出。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
当然这个镜像的体积非常小,只有一个输出功能,在较短的时间内下载到本地,执行输出后,镜像就会退出,当然其他类型的镜像会根据具体的情况来决定立即退出还是后台持续运行。
当我再次运行docker run hello-world
命令时,docker检测到本地已经存在镜像,就会直接启动运行,而并不会再次下载了。
基本使用
拉取(下载)镜像
当使用docker run
命令来启动一个本地不存在的镜像时,docker会自动的从网络拉取镜像。
而docker也提供了独立的下载命令docker pull 镜像名称
,使用这个命令会直接从网络拉取镜像,拉取完成后不会启动镜像。
查看本地镜像
使用docker images
命令可以查看本地已经下载的镜像列表。
删除本地镜像
使用docker rmi 镜像名
命令可以删除本地下载的镜像,当镜像被某个容器正在使用时是不能删除的。
启动镜像为容器
这里要区分镜像和容器的概念,镜像相当于一个建筑图纸,类似于程序中的Class的定义;而容器则是根据图纸制造的房间,类似于程序中根据Class实例化出来的对象。
所以镜像的作用也就是用来实例化容器,在helloworld中已经了解到使用docker run hello-world
来启动了一个打印完成后立即结束的容器,这里我们用一个不会立即结束的镜像来示例。
首先我们拉取一个5.7版本的mysql的镜像
docker pull mysql:5.7
然后使用如下命令来启动
docker run \
--name mysqldemo \
-e MYSQL_ROOT_PASSWORD=mypassword \
-d \
-p 3307:3306 \
mysql:5.7
拉取镜像后,就会安装参数来启动mysql的镜像,--name代表容器的名称,-e是容器中的环境变量,这里指定了root账号的密码,-d指定容器是后台运行,-p参数将容器中的3306端口映射到了本机的3307端口。
这样我们就得到了一个3307端口运行的mysql服务,通过修改docker命令的参数,我们甚至可以同时启动多个不同版本号和端口的mysql服务,这种体验是非docker环境不能比拟的,在实际运维中的优势瞬间就提现出来了。
查看容器
使用docker ps
命令,可以查看正在运行的容器情况。
使用docker ps -a
命令,可以查看包含已经停止运行的所有的容器。
停止/删除容器
使用docker stop 容器名或容器id
,停止正在运行的容器
使用docker rm 容器名或容器id
,删除已经停止运行的容器
使用docker rm -f 容器名或容器id
,强制删除包含正在运行的指定的容器
重启容器
使用docker restart 容器名或容器id
重启容器