注:
- docker中,同一功能的命令往往有多种,这里只列出某一风格的命令,原则是好记,不要在意茴香豆有几种写法。例如,用
docker image rm [镜像名]
删除镜像,而不是docker rmi [镜像名]
- docker 命令设计的非常好,以至于这篇文章可以很简介,例如,以下所有用到
container_id
的地方,都可以换成container_name
; 所有用到image_id
的地方,都可以换成image_name
简介
Docker三个基本概念
- Image:一组文件,分层构建
- Container:是Image的一个实例,有自己的root/网络/进程,和 Image 的关系如同类和对象的关系
- Repository:存储、分发 Image 的服务(例如 dockerhub https://hub.docker.com/)。一个 Docker Registry 中包含多个 Repository,每个 Repository 包含多个 Tag ,每个 Tag 包含一个镜像。
相关网站
容器的使用
建立一个容器
docker run -it ubuntu bash
# 若本地没有该镜像,则从远端下载
docker run hub.c.163.com/library/hello-world:latest
docker run -it ubuntu:14.04 /bin/bash
docker run -it --name="my-container-name" --volume /Users/guofei/git/:/Users/guofei/git/ ubuntu bash
-it
一般连在一起用。i表示让容器的标准输入保持打开,t表示让Docker分配一个伪终端并绑定到容器标准输入上-d
后台运行容器--rm
退出时清除文件系统--name="my-container-name"
指定一个名称--volume /Users/guofei/git/:/Users/guofei/git/
挂载目录-p 127.0.0.1:4006:4000
端口映射
查看容器
# 列出正在运行的容器
docker container ls
# 列出所有容器(包括Exited)
docker container ls -a
启用已经终止的 container
docker container start your_container_id
进入容器
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# -d 让Docker 后台运行,而不是直接将结果输出到当前宿主机下
# 会返回一个id
docker container logs <id or container_id or name> # 用来查看返回的信息
docker attach <id or container_id or name> # 对于后台运行的容器,进入容器(进去之后还在print)
docker exec -it <container_id or name> bash # 同样是进入容器(进去之后不显示print的内容,但后台还是一直在print)
# docker start [CONTAINER_ID or CONTAINER_NAME]
停止容器
docker stop your_container_id
# 停止所有运行中的容器
docker stop $(docker ps -q)
删除容器
docker container rm <container id>
docker container rm -f <name> # -f 删除运行中的 container
docker container prune # 清除所有 终止状态的 container
# 删除所有容器
docker container rm $(docker container ls -aq)
# 删除所有容器,包括 running 状态的
docker container rm -f $(docker container ls -aq)
容器改名
docker rename container_name new_container_name
保存
image 的保存和载入。
应用场景是,你要部署的目标机器不能连外网,那么用 docker save
打包,然后拷贝到目标机器上,用docker load
创建镜像。
docker save -o images.tar postgres:9.6 mongo:3.4
docker load -i images.tar # 会覆盖本地镜像库的镜像
container 的保存和导入
docker export -o docker_file.tar my-container-name
docker import docker_file.tar my_new_image
# 导入后成为一个新的 image,这个 image 名为 my_new_image
镜像
列出已经安装的镜像
docker image ls # 显示顶层镜像
docker image ls -a #显示包括中间层在内的所有镜像
# 从远端下载镜像
docker pull <image name>
# 删除指定镜像(删除镜像前须先停止并删除容器)
docker image rm [镜像]
docker commit [选项] [容器名] # 将容器的存储层保存为镜像。慎用,因为很多文件被添加进来,导致镜像极为臃肿
docker history [容器名] # 查看镜像的历史记录
定制镜像:Dockerfile
在空目录中建立一个文本文件,命名为Dockerfile
# 基于ubuntu镜像作为基础镜像
FROM ubuntu:latest
# 维护者信息
MAINTAINER Your Name <your.email@example.com>
# 安装依赖软件包
RUN apt-get update && apt-get install -y \
software-package1 \
software-package2 \
&& rm -rf /var/lib/apt/lists/*
# 复制文件到镜像中
COPY ./app /app
# 设置工作目录
WORKDIR /app
# 定义环境变量
ENV ENV_VARIABLE_NAME value
# 运行命令
CMD ["command", "arg1", "arg2"]
- 每个RUN会建立一层,所以注意尽量用一个RUN,并且用&&把多个SHELL命令串联起来
然后执行合格制作镜像
docker build -t <镜像名称> <Dockerfile路径>
实战:
FROM ubuntu:latest
MAINTAINER guofei9987 <me@guofei.site>
RUN apt-get update \
&& apt-get install -y sudo \
&& sudo apt update
# C 语言
RUN sudo apt install -y gcc make
# Java
RUN sudo apt install -y default-jdk
# Python
RUN sudo apt install -y python3 python3-pip
# Rust
RUN sudo apt install -y curl \
&& (curl --proto '=https' --sv1.2 -sSf https://sh.rustup.rs | sh -s -- -y) \
&& source $HOME/.cargo/env
说明
- 网络不太好的话,很难一次跑出来
- 可以用
&&
把所有的命令粘起来,以节省存储空间
# 制作镜像
docker build --no-cache -t my_img ./
# --no-cache 禁用缓存,在网络不好的时候可以选用
查看安装情况
gcc --version
make --version
java -version
python3 --version
pip --version
cargo --version
Docker Hub
https://cloud.docker.com
docker login # 登入
docker logout # 登出
docker search <name> #搜索
# 例如 docker search mysql 可以搜索所有mysql关键词
# 单个单词得镜像是官方镜像,guofei9987/mysql 是用户做的镜像
推送镜像
docker tag ubuntu guofei9987/ubuntu
docker push guofei9987/ubuntu
常用
清除全部container
docker container rm -f $(docker container ls -aq)
基础 linux
docker run -it --volume ${HOME}:${HOME} ubuntu bash
# 安装常用工具
apt-get update
apt-get install sudo
apt install tree
# 解决中文乱码问题
export LANG="zh_CN.UTF-8"
. /etc/profile
Anaconda
docker run -it --volume ${HOME}:${HOME} continuumio/anaconda3 bash
# 把本机的设置黏贴到docker中
cp /Users/guofei/.gitconfig ~/.gitconfig
cp -a /Users/guofei/.ssh ~/.ssh
jekyll
docker run --rm --label=jekyll --volume /Users/guofei/github/guofei9987.github.io:/srv/jekyll/blog_md_dir -it -p 127.0.0.1:4006:4000 jekyll/jekyll jekyll serve --force_polling --destination /srv/jekyll/blog --source /srv/jekyll/blog_md_dir
mysql
docker run --name=mysql1 -d mysql/mysql-server
# 获得初始密码:
docker logs mysql1
docker logs mysql1 2>&1 | grep GENERATED
docker exec -it mysql1 mysql -uroot -p
# 第一次使用,需要改密码
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
一些语言
# rust
docker run -it --volume ${HOME}:${HOME} rust bash
docker run -it --volume ${HOME}:${HOME} --platform=linux/amd64 rust bash
# java
docker run -it --volume ${HOME}:${HOME} --platform=linux/amd64 maven bash
# amd64 又称为 x86-64 或 x64,是最常见的
# 相比之下,MacBook 的 M 系列芯片是 arm 架构
参考资料
https://blog.csdn.net/liukuan73/article/details/78089138/