本文作者:陈进坚
个人博客:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:jian1098@qq.com
注意事项
- docker只能运行Linux系统
基本组成
- 客户端Client
- 守护进程Daemon
- 镜像Image
- 容器Container
- 仓库Registry
安装环境
- Docker维护版本(推荐)
1 | curl -sSl https://get.docker.com/|sudo sh |
- Ubuntu维护版本
1
2sudo apt-get install docker.io
source /etc/bash_completion.d/docker.io
查看版本1
sudo docker.io version
查看docker配置信息
1 | docker info |
配置文件
1 | /etc/default/docker |
重启docker
1 | systemctl restart docker |
启动容器
单次启动容器
1 | docker run 镜像名 命令 参数 |
例:
1 | sudo docker run ubuntu echo 'Hello world' |
按Ctrl+C
退出容器
为了方便非root用户运行,可以加入到用户组后运行
1 | sudo groupadd docker |
交互式容器
1 | docker run --name=container01 -it 镜像名 bash |
-i:–interactive=true 默认false,保持交互状态
-t:–tty=true 默认false,提供tty终端
完整的创建容器命令
1 | docker run -it --name=EntWallet -p 8888:8888 --mount type=bind,source=/data/golang/EntWallet,target=/data/golang ubuntu bash |
–name:自定义容器名
–mount:挂载共享目录,source:宿主机目录,target:容器目录
-P:映射全端口
-p:映射指定端口,前面是宿主机端口,后面是容器端口,访问宿主机端口就相当于访问容器的绑定端口
-d:后台启动
-v:目录映射,例如host_dir:container_dir
对应宿主机和容器目录,绑定后两个目录的数据将同步,容器被删除后宿主机数据不会删除;如果新容器映射这个目录,数据将同步到容器中
守护式容器
- 方法一:启动交互式容器后顺序按下
Ctrl+P
和Ctrl+Q
进入正在运行的容器
1 | docker attach 容器名或ID |
- 方法二:直接加
-d
参数启动
1 | docker run -d 镜像名 命令参数 |
退出当前容器:exec
停止守护式容器
1 | docker stop 容器名 |
或
1 | docker kill 容器名 |
区别:stop会发出停止信号等待容器停止并返回容器名,kill会直接快速停止容器
查看容器
容器列表
1 | docker ps [-a] [-l] |
不加参数:列出正在运行的容器
-a:列出所有容器
-l:列出最新创建的容器
获取容器完整id
1 | docker inspect lnmp|grep Id |
通过ID查看容器详情
1 | docker inspect 容器ID或仓库名+tag名 |
通过容器名查看容器详情
自定义容器名称
1 | docker run --name=container01 -i -t ubuntu /bin/bash |
查看详情
1 | docker inspect container01 |
重新启动已停止的容器
1 | docker start [-i] 容器名 |
-i :交互命令行
删除已停止的容器
1 | docker rm 容器名或ID |
参数:
-f:强制删除正在运行的容器
删除所有容器
1 | docker rm `docker ps -a -q` |
查看容器日志
1 | docker logs [-f] [-t] [--tail] 容器名 |
-f:–follows=true 默认false,跟踪日志并返回结果
-t:–timestamps=true 默认false,返回结果加上时间戳
–tail:=’all’,显示的条数,默认全部显示
注意:容器重启后ip和端口映射都会发生变化
查看容器内进程
1 | docker top 容器名 |
在运行中的容器启动新进程
1 | docker exec [-d] [-i] [-t] 容器名 命令 参数 |
帮助命令
1 | man docker-rum |
查看容器的端口映射
1 | docker container port 容器id |
设置容器的端口映射
1 | docker run -P -i -t ubuntu /bin/bash |
-P:–publish-all=true 默认false,映射容器所有端口
-p:指定映射端口;-p 80 :只指定容器端口;-p 8080:80 :指定宿主机和容器端口;-p 0.0.0.0:80:指定容器ip和端口;-p 0.0.0.0:8080:80:同时指定ip、宿主机和容器端口;
给已存在的容器添加端口映射
提交一个运行中的容器为镜像
1 | docker commit containerid foo/live |
运行镜像并添加端口
1 | docker run -d -p 8000:80 foo/live /bin/bash |
镜像
镜像列表
1 | docker images |
-a,–all=false:显示所有镜像,包括没有标签的中间层镜像
-f,–filter=[]
–no-trunc=false:显示完整的镜像ID
-q,–quiet=false
仓库
仓库是一系列镜像的集合
标签
同一个仓库中的镜像用标签来区分,不同标签可能对应同一个镜像ID
删除指定镜像
1 | docker rmi 镜像ID或仓库名+标签 |
删除所有镜像
1 | docker rmi `docker images -q` |
获取和推送
- 搜索镜像
从官网搜索镜像https://hub.docker.com/
命令行搜索:
1 | docker search |
- 拉取镜像
1 | docker pull 仓库名:标签名 |
- 推送镜像
1 | docker push 仓库名 |
需要登录
构建镜像
保存修改的内容,后面可以使用构造的镜像来运行容器同时使用之前修改的内容
通过容器构造
1 | docker commit 容器名 镜像名 |
-a,–author=””:作者
-m,–message=””:镜像信息
-p,–paause=true:是否暂停正在执行的容器
通过Dockerfile
构建
1 | docker build -t 镜像名 |
查看构建过程
1 | docker history |
构建好的镜像可以用docker images
命令查看
Dockerfile
组成:大写命令+小写参数
1 | # 这是注释 |
执行dockerfile
首先进入到Dockerfile所在目录,然后执行命令
1 | docker build -t bitcoinpaygate/regtest-bitcoind:latest . |
参数是镜像名:标签名和上下文(.)
创建完成镜像即可打开容器
1 | docker run --name regtest -it bitcoinpaygate/regtest-bitcoind:latest bash |
docker守护进程操作
1 | sudo service docker start/stop/restart |
运行docker hub上的镜像
下载镜像
1 | docker pull huangguoji/lnmp |
如果不指定标签,默认会加上:latest
标签
以该镜像运行容器
1 | docker run -it huangguoji/lnmp:latest bash |
如果仅运行一次,可以加上--rm
,当容器退出会自动删除容器
文件传输
容器和宿主机传输
通过容器id
或名字查到容器的长id
1 | docker inspect 549288a2fc7f |
然后在宿主机中用docker cp
或mv
命令即可,注意容器id
后面的冒号
1 | docker cp 549288a2fc7f74e63de13e37a2aae0db59af6543696fd29530175a1bd757b518:/root/go/main.go /root |
1 | docker cp /root/main.go 549288a2fc7f74e63de13e37a2aae0db59af6543696fd29530175a1bd757b518:/root/go |
FTP工具
在创建容器的时候需要绑定端口映射
1 | docker run --name containername -p 3000:80 -p 3001:21 -d dockerimagename |