Too young, too simple. Sometimes, naive & stupid

Docker简单介绍

记得第一次知道容器这个词是2016年(技术渣),那时Openstack还如日中天,我安装了一个Ubuntu,翻了翻文档, 百度看了下仅有的几个博客,用蹩脚的操作安装上Docker(那时还部分ce,ee)就那几分钟,Docker就可以实现部署好几种应用来完成我的测试,发现docker这真是个神器,到今天为止,我也没有玩明白docker(没有长期的投入实践),包括以后的Kubernetes,Openshift,Rancher等等这些PaaS平台,也仅仅是部署,这里就不说原因了;从今天起,开始复习这些略识之无的东西,今天先复习一下命令。

安装Docker

这里以Centos7为例:

  1. 卸载系统自带的docker
1
yum remove -y docker  docker-client  docker-client-latest  docker-common  docker-latest  docker-latest-logrotate  docker-logrotate  docker-selinux  docker-engine-selinux  docker-engine
  1. 添加Docker yum存储库
    1
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  2. 安装docker-ce
1
yum install -y docker-ce
  1. 启动docker服务
1
systemctl enable docker ; systemctl start docker
  1. 测试
1
docker run hello-world

如果需要卸载 记得卸载后删除 /var/lib/docker目录

Docker 概念

Docker是开发人员和系统管理员 使用容器开发,部署和运行应用程序的平台。使用Linux容器部署应用程序称为容器化。容器不是新的,但它们用于轻松部署应用程序。

容器化越来越受欢迎,因为容器是:

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:您可以即时部署更新和升级。
  • 便携式:您可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:您可以增加并自动分发容器副本。
  • 可堆叠:您可以垂直和即时堆叠服务。

images 和 containers

通过运行image启动容器,一个image是一个可执行的包,其中包括运行程序所需的所有内容和代码、运行时环境、依赖库、环境变量和配置文件。

这里不说内部实现,从目的来看,启动一个容器的目的是为了运行一个程序,虚拟机则是安装配置一个应用程序,容器可以省去一些重复工作, 提高效率;容器运行, 在操作系统看来,就是一个独立进程,完成了沙盒应用的功能,而虚拟机则运行了一个“完整的GuestOS”,通过虚拟机管理程序(hypervisor )对主机进行虚拟访问。

Docker 基本命令

基本信息查看命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## List Docker CLI commands
docker
docker container --help

## Display Docker version and info
docker --version
docker version
docker info

## Execute Docker image
docker run hello-world

## List Docker images
docker image ls

## List Docker containers (running, all, all in quiet mode)
docker container ls
docker container ls --all
docker container ls -aq

简单Dockerfile

Dockerfile例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

基于Dockerfile构建应用镜像

1
docker build -t image-name .

查看基于Dockerfile构建的镜像

1
docker image ls

运行容器

1
docker run -d -p 4321:80 testimage

待容器运行,会基于名为testimage的镜像后台运行一个容器,并且将容器内部的80端口映射到本机4321端口,如果容器80端口将可以访问,现在则可以访问宿主机ip:4321来访问容器内部的80端口。

发布镜像

可以将本地的镜像发布到dockerhub, 随处下载运行自己的镜像,
首先你需要创建一个dockerhub账户.

本地登录dockerhub

1
docker login

标记镜像

1
docker tag image username/repository:tag

例如

1
docker tag testimage xieth/mytestimage:v1

查看新标记的image

1
2
3
# 以下两行命令功能相同
docker image ls
docker images

现在可以从其他计算机运行刚才发布的镜像了。
1
docker run -p 4321:80 xieth/mytestimage:v1

基本命令整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
docker container ls # List all running containers
docker container ls -a # List all containers, even those not running
docker container stop <hash> # Gracefully stop the specified container
docker container kill <hash> # Force shutdown of the specified container
docker container rm <hash> # Remove specified container from this machine
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker image rm <image id> # Remove specified image from this machine
docker image rm $(docker image ls -a -q) # Remove all images from this machine
docker login # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag # Tag <image> for upload to registry
docker push username/repository:tag # Upload tagged image to registry
docker run username/repository:tag # Run image from a registry

小结

docker 的命令风格跟linux几乎一样,忘了直接docker --help 看下帮助,其实这些命令就现在看来几乎用不上,现在大家都在关注容器上层的集群编排,大部分不需要用手动敲命令来一个个实现, 而是通过标记语言yaml来实现容器的构建与运行。