docker的使用

Docker容器的特点:

  • 轻量:容器是进程级的资源隔离,而虚拟机是操作系统级的资源隔离,所以Docker容器相对于虚拟机来说可以节省更多的资源开销,因为Docker容器不再需要GuestOS这一层操作系统了。
  • 快速:容器的启动和创建无需启动GuestOS,可以实现秒级甚至毫秒级的启动。
  • 可移植性:Docker容器技术是将应用及所依赖的库和运行时的环境技术改造包成容器镜像,可以在不同的平台运行。
  • 自动化:容器生态中的容器编排工作(如:Kubernetes)可帮助我们实现容器的自动化管理。

1.Docker的安装

a.Linux(Centos、Ubuntu通用)

1
2
3
4
# 使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 使用国内daocloud一键安装命令
curl -sSL https://get.daocloud.io/docker | sh

安装完成后运行一下命令查看是否安装成功

1
2
docker version
docker info

Docker需要sudo用户权限,为避免每次命令都输入sudo,可以将用户加入docker用户组

1
2
3
4
# 1.创建docker用户组
sudo groupadd docker
# 2.添加用户进入docker用户组
sudo usermod -aG docker $USER

注销并重新登录,以便重新评估组成员关系。如果在虚拟机上进行测试,可能需要重新启动虚拟机以使更改生效。在桌面Linux环境(如X Windows)中,完全注销会话,然后再重新登录。在Linux上,您还可以运行以下命令来激活对组的更改

1
2
3
4
# 3.激活用户组更改
newgrp docker
# 4.验证docker用户是否还需要sudo
docker run hello-world

如果出现以下warning说明权限不正确

1
2
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

要解决此问题,请删除〜/ .docker /目录(该目录会自动重新创建,但是所有自定义设置都会丢失),或者使用以下命令更改其所有权和权限:

1
2
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

docker启动

1
2
3
4
5
6
7
8
9
10
11
# 启动docker服务
systemctl start docker
service docker start
# 重启docker服务
systemctl restart docker
sudo service docker restart
# 关闭docker服务
systemctl stop docker
service docker stop
# 查看docker是否启动成功
docker ps -a # (查看运行中的容器)

2.基本指令

a.镜像篇

1
2
3
4
5
6
7
8
9
10
docker images # 查看所有镜像
docker rmi imagesId # 删除镜像 imagesId为镜像id
docker rmi $(docker images -q) -f # 删除所有镜像
docker pull [images]:[version] # 从dockerhub拉取指定镜像
docker run -p 8000:80 -tdi --privileged [imageId] [command] 后台启动docker,并指定宿主机端口和docker映射端口
-i # 以交互模式运行容器,通常和-t同时使用
-d # 后台运行容器,返回容器ID
-t # 为容器重新分配一个伪输入终端,通常与-i同时使用
--privilegid # 容器将拥有访问主机所有设备的权限
# 通常情况下[command]填下/bin/bash即可

b.容器篇

1
2
3
4
5
6
docker ps # 查看所有正在运行中的容器
docker ps -a # 查看所有容器
docker ps -a -q # 查看所有容器ID
docker stop containerId # 停止容器 containerid为容器id
docker stop $(docker ps -a -q) # 停止所有容器
docker rm $(docker ps -a -q) # 删除所有容器

注意:容器需要停止后才能删除干净

c.常用操作

1
2
3
docker exec -it [containerID] /bin/bash # 进入到一个运行中的容器当中
docker cp [YourHostFilePath] [containerID]:[DockerPath] # 拷贝容器数据到主机
dockers log -tf --tail 5 id # 查看日志

d.镜像制作提交

1
2
3
4
5
6
docker commit [containerID] [ImageName]:[Version] # 将修改后的容器重新打包成镜像
-a # 提交的镜像作者;
-c # 使用Dockerfile指令来创建镜像;
-m # 提交时的说明文字;
-p # 在commit时,将容器暂停。
docker push [ImageID] [repertory_address] # 提交镜像到云仓库

e.容器状态

Docker容器有以下几种状态:created(已创建),restarting(重启中),running(运行中),removing(迁移中),paused(暂停),exited(停止),dead(死亡)

3.Dockerfile编写

a.保留字指令

FROM:基础镜像
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:容器对外暴露出的端口
WORKDIR:终端默认登陆的进来工作目录
ENV:构建镜像过程中设置环境变量

1
ENV MY_PATH /usr/mytest

ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中。

1
2
3
4
//src dest均为目录,表示把src下的文件拷贝到dest目录下
COPY server /usr/local/server/
//src为文件,dest为目录,表示把src这个文件拷贝到dest目录下
COPY run.sh /usr/local/sbin/

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定一个容器启动时要运行的命令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。

ENTRYPOINT:指定容器运行的命令,可以追加命令

1
2
3
4
5
6
7
CMD ["executable","param1","param2"] (exec格式)
CMD ["param1","param2"] (参数列表格式,作为ENTRYPOINT的默认参数)
CMD command param1 param2 (shell格式)

#实例
CMD echo "hello cmd!"
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]

ONBUILD:子镜像继承父镜像,子镜像运行时,父镜像ONBUILD被触发。

b.DockerFile编写(centos)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM centos
#作者与邮箱
MAINTAINER shadowy<xxxx@qq.com>
#设置环境
ENV MYPATH /usr/local
#容器启动后的落脚路径
WORKDIR $MYPATH
#运行安装命令
RUN yum -y install vim
RUN yum -y install git
#暴露80端口
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

1
2
3
4
# docker build -f DockFile路径 -t 新镜像名字:TAG .
docker build -f DockerFile -t mycentos:2.0 .
# 镜像变更历史
docker history 镜像ID