docker
安装
# 卸载老版本
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
# SET UP THE REPOSITORY
sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2
sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io
# Start Docker.
sudo systemctl start docker
# Verify that Docker CE is installed correctly by running the hello-world image.
sudo docker run hello-world
# Uninstall Docker CE
1. Uninstall the Docker package:
$ sudo yum remove docker-ce
2. Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:
$ sudo rm -rf /var/lib/docker
常用命令
docker version # 查看版本
docker search hello-world # 搜索docker的镜像
docker pull hello-world # 下载docker的镜像
docker push 镜像名 # 把本地镜像推送到dockerhub
docker image ls # 查看镜像
docker images # 查看镜像
docker run 镜像名/镜像id(可以只写前3位) 起了就关
docker stop 容器id # 停止正在运行的容器
docker start 容器id # 启动一个关闭中的容器
docker run -it 镜像名/镜像id # 运行一个docker容器实例,
### 相关参数
-i:交互式界面
-t: 开启一个终端
-d: 后台运行容器,返回容器ID
--name:给容器起别名
--rm:运行完就删除容器
-P:随机端口转发
-p 外部port:docker内部port: 指定端口转发
-v /data:/data:挂载宿主机的文件到容器文件夹
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
/bin/sh 调用shell解释器
-c 指定一段shell脚本
docker logs -f 容器id # 查看正在运行中容器的日志, -f表示不间断打印
docker port 容器id #查看容器运行端口
docker ps # 查看docker进程,只能查看正在
docker ps -a # 查看所有运行过的docker容器记录
docker ps -qa # 查看id
docker rm 容器id # 删除的是已经停止的容器
docker rm `docker ps -aq` # 一次性删除所有容器
docker rmi 镜像id # 删除一个镜像记录,必须把和该镜像相关的容器全删除后才能删除镜像
docker commit # 提交容器记录为新的镜像
docker exec -it 容器id /bin/bash # 进入正在后台运行的docker
导出、导入镜像
# 导出centos镜像
docker save centos > /data/centos.tar.gz
# 导入centos镜像
docker load centos < /data/centos.tar.gz
Dockerfile
Dockerfile就是一个文本,里面包含一条条指令。每条指令构建一层,所以每条指令就是描述该层应当如何构建。
# myflask.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "hello"
if __name__ == "__main__":
app.run(host="0.0.0.0", port="5000")
# Dockerfile示例
FROM centos
LABEL maintainer="xxx@163.com"
ADD CentOS-Base.repo /etc/yum.repos.d
ADD CentOS-Epel.repo /etc/yum.repos.d
RUN echo "hah"
RUN yum clean all
RUN yum update -y
RUN yum install python-pip -y
RUN pip install flask
RUN mkdir app
RUN echo "hah"
COPY my_flask.py app # 将本地Dockerfile同目录的my_flask.py拷贝到容器指定目录
WORKDIR app
EXPOSE 5000 # 暴露容器的5000端口,给宿主机访问
CMD python my_flask.py # 运行文件
# 构建docker镜像文件
docker build -t docker账户名/镜像名 .
# 运行
docker run -d -p 8080:8080 docker账户名/镜像名
#发布自己的镜像
1. docker login
2. 更改现有镜像的名字为:dockerUsername/镜像名
docker tag 7698f282e524 tmdhhl/python3:latest
3. docker push 本地镜像
构建私有仓库
# 下载docker官方提供的私有仓库镜像
下载并启动官方registry镜像
docker run -d
-p 5000:5000
-v /opt/data/registry:/var/lib/registry
registry
# 使用 docker tag 来标记一个镜像,然后推送它到仓库
# 格式: docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
# 查看仓库中的镜像
curl 127.0.0.1:5000/v2/_catalog
# 下载本地仓库中的镜像
docker pull 127.0.0.1:5000/ubuntu:latest
注意事项
如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制。
# 在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirror": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.199.100:5000"
]
}
注意:该文件必须符合 json 规范,否则 Docker 将不能启动
更多高级使用:https://yeasy.gitbooks.io/docker_practice/repository/registry_auth.html