常见的Linux平台,Docker可以使用https://get.docker.com/ 中提供的脚本来一键完成安装。
# 下载脚本
curl -fsSL https://get.docker.com -o get-docker.sh
chmod +x get-docker.sh
脚本提供国内镜像源进行加速:
# 使用 Azure 进行加速
sh get-docker.sh --mirror AzureChinaCloud
# 使用 Aliyun 进行加速
sh get-docker.sh --mirror Aliyun
安装过程较慢,等待一段时间即可。然后启动docker服务。
systemctl start docker
Docker镜像(Image)是创建Docker容器的基础。镜像相当于静态模板,通过Image镜像可以启动多个Container容器。
Image镜像可以自行构建,推送到私有镜像仓库,或者提交到共有镜像仓库docker-hub上进行托管。
我们也可以直接使用docker-hub上公共的Image镜像来快速启动Container。
# 从docker-hub拉取nginx基础镜像
docker pull nginx
查看本地所有的Image镜像。
docker image ls
# 也可以使用老版本的命令,效果相同
docker images
查看镜像详情,返回JSON格式数据。
docker image inspect nginx
使用nginx镜像启动docker容器。
docker run --name nginx-container -p 8080:80 -d nginx
此时可以通过浏览器访问虚拟机IP:8080端口,查看Nginx是否运行。如果无法访问,请重新构建docker0网桥。
# 停止docker
systemctl stop docker
# 安装bridge-utils
yum install -y bridge-utils
# 关闭docker0网桥
ip link set dev docker0 down
# 删除docker0网桥
brctl delbr docker0
# 添加docker0网桥
brctl addbr docker0
# 添加网桥信息
ip addr add 172.16.10.1/24 dev docker0
# 启动docker0网桥
ip link set dev docker0 up
# 查看网桥是否正常
ip addr
# 启动docker
systemctl restart docker
查看所有运行中的Container容器。
docker container ls
# 也可以使用老版本的命令,效果相同
docker ps
查看所有Container容器(包含已停止的)。
docker container ls -a
# 也可以使用老版本的命令,效果相同
docker ps -a
进入运行中的容器。
docker exec -it nginx-container bash
在容器内执行完操作后,可以退出。
exit
如果容器在运行过程中出错,可以查看容器的日志。
docker logs nginx-container
可以对容器进行关闭、强制杀死的操作。
docker stop nginx-container
docker kill nginx-container
对于停掉的容器,可以再次启动。
docker start nginx-container
或者直接对容器进行重启。
docker restart nginx-container
如果,容器已经没有存在的必要,可以直接进行删除。
docker rm nginx-container
前面,我们使用docker-hub中现成的Image镜像来运行Container容器。在生产中,一般需要将自己的应用,通过编写DockerFile构建成Image镜像。然后交给运维,快速在生产环境中运行Container容器,完成应用的部署。
首先,在/root/nginx_builder目录中编写一个DockerFile,封装nginx组件。
mkdir /root/nginx_builder
vim /root/nginx_builder/Dockerfile
Dockerfile中内容如下:
### nginx
### VERSION 0.0.1
FROM nginx
MAINTAINER Teacher Demos <teacher@docker.com>
RUN echo 'this is a diy nginx image' > /usr/share/nginx/html/index.html
其中FROM语句指定了依赖的镜像,这里使用ubuntu。MAINTAINER填写构建者信息,这里填写为Tearcher,并留了邮箱。最后的RUN语句,指定在ubuntu镜像中执行apt更新和软件安装的命令。
接下来,通过DockerFile来生成Image镜像。
docker build -t demo_nginx /root/nginx_builder/
启动Container容器。
docker run --name demo_nginx -p 8080:80 -d demo_nginx
快速了解Dockerfile构建镜像后,可以找资料深入学习这一块的内容。
在生产过程中,一般情况下,会通过Dockerfile来构建Image镜像。但也支持通过Container来生成Image镜像。这种场景一般用于快速对容器内驱动包、环境变量等内容的替换,或者生产问题的快速修复。进入要维护的Container中,使用命令完成操作后,将Container生成Image即可。
首先,生成一个index.html文件,然后将demo_nginx容器中的index.html文件进行替换,持久化为Image镜像。
echo "<h1>Hello Nginx</h1>" > /root/index.html
将容器内的文件拷贝到本地/tmp目录进行备份。
docker cp demo_nginx:/usr/share/nginx/html/index.html /tmp/
将要替换的index.html拷贝到容器中。
docker cp /root/index.html demo_nginx:/usr/share/nginx/html/
以命令行交互方式进入到容器。
docker exec -it demo_nginx bash
查看文件是否替换成功。
cat /usr/share/nginx/html/index.html
退出容器。
exit
将当前Container持久化为Image。
docker commit demo_nginx new_demo_nginx
查看所有Image镜像。
docker image ls
当然也可以删除镜像。
docker image rm new_demo_nginx
Container是无状态的,它在运行时,会提供一个可读写层进行数据的临时存储,在停止的时候会清空所有数据。为了使容器中必要的数据持久化保存,如配置文件、日志等信息,需要将本地的目录挂载到容器中。这样在容器重启后,重要的数据便不会丢失,而且多个容器挂载同一个目录,可以完成数据的共享操作。
现在,将nginx容器中的/usr/share/nginx/html/目录挂载到本地的/root/nginx/html下。在启动容器时,可以使用-v参数指定数据的挂载。
现在本地创建数据存储目录。
mkdir -p /root/nginx/html
删除之前的demo-nginx容器。
docker container stop demo_nginx
docker container rm demo_nginx
启动新的Container,并进行磁盘挂载。
docker run --name other-nginx -p 8080:80 -v /root/nginx/html:/usr/share/nginx/html/ -d demo_nginx
将本地的index.html文件拷贝到/root/nginx/html目录下,查看容器内是否已经生效。
cp /root/index.html /root/nginx/html/login.html
此时访问虚拟机IP:8080/login.html,发现已经可以访问。