Docker日常笔记
安装
Ubuntu 22.04 安装
1、删除安装过的docker:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done
2、安装依赖:
apt-get update
apt-get install ca-certificates curl gnupg
3、添加仓库:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
4、安装docker-ce
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5、配置镜像源 (每次更新配置文件需重启)
vi /etc/docker/daemon.json
{
"iptables": false,
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://xxxxxx.mirror.aliyuncs.com",
"https://docker.kubesre.xyz"
]
}
5、重启服务进程
systemctl start docker
默认安装:
apt install docker.io
apt install docker-compose
使用国内加速源
默认情况下,Docker 会使用以下配置文件:
Linux: /etc/docker/daemon.json
Windows: C:\ProgramData\Docker\config\daemon.json
将镜像加速地址加入到你的Docker配置文件/etc/docker/daemon.json中
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
拉镜像走代理(如果走国内加速建议关闭):
$ cat /etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://localhost:10809"
Environment="HTTPS_PROXY=http://localhost:10809"
$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://localhost:10809 HTTPS_PROXY=http://localhost:10809
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
私有阿里源: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
quay.io等的国内镜像源记录
docker.io docker.m.daocloud.io
gcr.io gcr.m.daocloud.io
ghcr.io ghcr.m.daocloud.io
k8s.gcr.io k8s-gcr.m.daocloud.io
registry.k8s.io k8s.m.daocloud.io
quay.io quay.m.daocloud.io
常见镜像仓库
docker.io:Docker Hub 官方镜像仓库,也是 Docker 默认的仓库
gcr.io、k8s.gcr.io:谷歌镜像仓库
quay.io:Red Hat 镜像仓库
ghcr.io:GitHub 镜像仓库
常见镜像源
中国区官方镜像: https://registry.docker-cn.com
中科大源: https://docker.mirrors.ustc.edu.cn
腾讯源: https://mirror.ccs.tencentyun.com
网易源: http://hub-mirror.c.163.com
中科大镜像地址:http://mirrors.ustc.edu.cn/
Azure中国镜像地址:http://mirror.azure.cn/
DockerHub镜像仓库: https://hub.docker.com/
RedHat镜像仓库: https://quay.io/repository/
RedHat镜像仓库: https://access.redhat.com/containers
配置1 (修改完配置记得重启docker进程)
{
"registry-mirrors": ["https://reg-mirror.qiniu.com"]
}
配置2 (修改完配置记得重启docker进程)
{
"registry-mirrors": ["https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://docker.m.daocloud.io"]
}
Dockerfile
Debian替换国内源
RUN sed -i -r 's#http://deb.debian.org#https://mirrors.aliyun.com#g' /etc/apt/sources.list
Docker可视化工具
Portainer
创建一个Portainer专用的卷,然后在8000和9000端口创建容器并运行:
$ docker volume create portainer_data
$ docker run --name portainer -d -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
然后在浏览器打开对应地址。第一次运行的时候需要设置账号,然后选择要管理的Docker主机。
LazyDocker
LazyDocker是基于终端的一个可视化查询工具,支持键盘操作和鼠标点击。
Docker 卷管理
官方文档:https://docs.docker.com/storage/volumes/
CentOS 7 安装docker-ce
先去这里下载rpm包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
然后安装:
yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm
docker-composer安装则根据官方推荐的方式安装:https://docs.docker.com/compose/install/#install-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
国内用户 kali-rolling 快速安装docker-ce
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/docker-ce/linux/debian/ stretch stable" >> /etc/apt/sources.list
apt update
apt install docker-ce
快速拉一个镜像下来
docker pull reg.qiniu.com/library/mongo
运行中容器配置位置
/var/lib/docker/containers/<conainerID>
运行示例:
docker run \
-p 5211:22 \
-p 5212:80 \
-p 5213:6379 \
-p 5214:443 \
-p 5215:21 \
-p 5216:23 \
-p 5217:3306 \
-p 5218:27017 \
-p 5219:9200 \
-p 5220:9300 \
-p 5221:5221 \
-p 5222:5222 \
-p 5223:5223 \
-e ROOT_PASS=password \
-e MYSQL_PASS=password \
-v /home/workspace/malu/docker/app:/app \
-h lamp \
--name lamp \
-d malu.me/malu/docker_lamp:master
参数说明:
-p 端口映射
-e 环境变量
-v 卷挂载点
-h 主机名
--name 容器名称
-d 后台运行
-P 参数: 将dockerfile中EXPOSE指令指定的端口(容器内端口)对本地宿主机公开,并随机绑定到本地宿主机的端口上。
部署示例
influxdb
docker run -p 8086:8086 -v /app/data/influxdb:/var/lib/influxdb2 influxdb
OLD
快速安装
apt-get -y install docker.io
升级Docker
sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
apt-get update
apt-get install lxc-docker
从本地提交镜像
1. 登录私有镜像仓库
docker login -u [用户名] -p [密码] -e [电子邮件] https://xxx.com
2. 给本地host的镜像打tag
docker tag [镜像ID] xxx.com/[用户名]/[镜像名称:标签]
3. 推送镜像到私有仓库
docker push xxx.com/[用户名]/[镜像名称:标签]
查看镜像
docker images
删除镜像
docker rmi [镜像名称:标签]
删除容器
docker rm [容器ID]
docker rm -f [容器ID] #强制删除运行中的容器
docker ps -a -q|xarge docker rm #删除所有不在运行的容器
拉取镜像
docker pull [镜像路径]
登录daocloud帐号:
docker login daocloud.io
运行镜像:
docker run -d -p [外网端口]:[镜像端口] -e [环境变量] [镜像ID]
查看运行中的docker:
docker ps
查看所有启动过的docker:
docker ps -a
停止/启动docker:
docker stop [docker运行ID]
docker start [docker运行ID]
启动已经关闭的容器(以交互模式启动,有些没有守护的容器可以用这种方式启动)
docker start -ia [docker运行ID]
登录容器:
docker exec -it [container_id] /bin/bash
查看容器日志:
docker logs [docker运行ID]
查看容器运行信息:
docker inspect [docker运行ID]
查看容器资源占用信息:
docker stats [docker运行ID]
查看正在运行容器端口映射情况:
docker port NAME
添加新用户:
useradd -r -m -s /bin/bash
删除docker0网卡
虚拟网卡docker0其实是一个网桥,如果想删除它,只需要按照删除网桥的方法即可。
ifconfig docker0 down
brctl delbr docker0
docker0这个网桥是在启动Docker Daemon时创建的,因此,这种删除方法并不能根本上删除docker0,下次daemon启动(假设没有指定-b参数)时,又会自动创建docker0网桥。
在启动时不创建网桥:
docker -d --bridge=none
开启docker远程API
1.编辑配置文件
vim /etc/default/docker
DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:5000'
比如我开放5000端口
2.重启docker
service docker restart
3.通过接口查看所有容器运行状态
http://localhost:5000/containers/json?all=1
更多接口使用,参考官方文档
给运行中容器添加端口:
获得容器IP,将container_name 换成实际环境中的容器名
docker inspect 'container_name' | grep IPAddress
iptable转发端口,将容器的8000端口映射到Docker主机的8001端口
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8000
查看iptables映射情况:
iptables -t nat -L
只查看DOCKER链并显示规则编号:
iptables -L DOCKER --line-numbers -n -t nat
删除(其中5就是规则编号):
iptables -D DOCKER 5 -t nat
也可以commit一个出来,再重新运行
docker commit 示例
docker commit [docker运行ID] reg.qiniu.com/malu/docker_base:ffmpeg-2
32位系统部署Docker
由于Docker Hub Registry上面的镜像都是64位的,所以这里需要自己做一个Ubuntu的镜像,这里使用import命令,该命令的官方解释为:Create a new filesystem image from the contents of a tarball.这里使用openVZ的模板来创建.
openVZ模板的下载地址为:http://openvz.org/Download/templates/precreated
执行导入:
wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
cat ubuntu-14.04-x86-minimal.tar.gz | docker import - ubuntu:14.04
也可以直接导入:
docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
接下来就可以运行了:
docker run -i -d ubuntu:14.04 -t /bin/bash
然后可以根据需要自己构建(进入Dockerfile目录):
docker build -t malu/docker_lamp .
基于32位的镜像生成新的镜像,期间如果构建出错可以修改Dockerfile再次构建,默认会调用缓存。
重命名镜像tag
docker run -d [镜像ID] -t /bin/bash #先启动一个
docker commit -a 'aa' [容器ID] ubuntu:first #然后把它提交成新镜像
这样就新生成了一个镜像:
root@ACER-mini:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu first a70f0f795d4b 5 seconds ago 205.2 MB
ubuntu 14.04 65161a7b2077 3 hours ago 205.2 MB
当然上面的方法很傻,其实我们只要:
docker tag imageid name:tag #新建tag
docker rmi name:oldtag #删除原来tag
备份迁移
打包成tar
docker save -o filename.tar [镜像ID]
恢复打包文件
docker load -i filename.tar
重命名容器名:
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec7d53c91621 70683c8feae9:latest "/run.sh" 2 hours ago Exited (64) 2 hours ago goofy_stallman
0a3869ba2838 b9ec47bb8b8d:latest "/run.sh" 22 hours ago Up 2 hours 0.0.0.0:9221->9200/tcp logstash
3ad0379db41d 70683c8feae9:latest "/run.sh" 25 hours ago Exited (0) 25 hours ago cranky_rosalind
6d829565caf4 f9aabae65d48:latest "/usr/local/run.sh" 28 hours ago Exited (0) 5 hours ago naughty_curie
root@ubuntu:~# docker rename goofy_stallman one
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec7d53c91621 70683c8feae9:latest "/run.sh" 2 hours ago Exited (64) 2 hours ago one
0a3869ba2838 b9ec47bb8b8d:latest "/run.sh" 22 hours ago Up 2 hours 0.0.0.0:9221->9200/tcp logstash
3ad0379db41d 70683c8feae9:latest "/run.sh" 25 hours ago Exited (0) 25 hours ago cranky_rosalind
6d829565caf4 f9aabae65d48:latest "/usr/local/run.sh" 28 hours ago Exited (0) 5 hours ago naughty_curie
aufs文件系统安装
http://cloud.51cto.com/art/201412/461261.htm
生成requirements.txt文件:
pip install redis
pip freeze > requirements.txt
docker容器故障致无法启动解决办法
首先通过启动日志查看问题原因:
docker logs [docker运行ID]
然后根据问题,到启动数据/var/lib/docker/aufs/diff/路径下。
比如我遇到Nginx启动失败,那就查找nginx配置文件:
root@ubuntu:/var/lib/docker/aufs/diff# find ./ -name 'nginx.conf'
./399145668ccb628a0a9cc572431b93c17a72f84625d8430d9897fd46e572f4dd/etc/nginx/nginx.conf
./0609441079c15cc8214d1f55bdcdb270da9b94008e4432f81d98a96460f54f25/etc/nginx/nginx.conf
然后去修改对应问题。
参考文档:http://dockerpool.com/static/books/docker_practice/index.html
新浪SEC安装docker环境
以下是安装记录
yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install docker-io
yum upgrade device-mapper-libs
sudo groupadd docker
sudo usermod -a -G docker $USER
service docker start
chkconfig docker on
docker -d
docker images
sudo docker info
建立网桥
docker network create -d bridge --gateway=192.168.0.1 --subnet=192.168.0.1/24 mybridge
docker-compose
快速安装:
pip install docker-compose
docker-compose.yml Example:
version: '2'
services:
python:
image: reg.qiniu.com/pub/docker_base:python-2
ports:
- "50100:22"
- "52100-52200:5100-5200"
volumes:
- /home/malu/python/app:/app
container_name: python
hostname: python
command:
- /bin/bash
- -c
- |
cron
/usr/sbin/sshd -D
networks:
default:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.19.0.0/16
Docker的Web管理平台portainer (https://portainer.io) docker-compose.yml:
portainer:
restart: always
image: portainer/portainer
ports:
- "11110:9000"
command: -H unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data
container_name: portainer
Docker-registry仓库 docker-compose.yml:
registry:
restart: always
image: registry:2
ports:
- 11111:5000
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/malu.me.crt
REGISTRY_HTTP_TLS_KEY: /certs/malu.me.key
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
- ./data:/var/lib/registry
- ./certs:/certs
- ./auth:/auth
container_name: registry
Docker-registry仓库Web管理平台(https://github.com/mkuchin/docker-registry-web) docker-compose.yml:
registry-web:
restart: always
image: hyper/docker-registry-web
ports:
- 11112:8080
volumes:
- ./conf:/conf:ro
- ./db:/data
container_name: registry-web
conf/config.yml
registry:
url: http://registry:5000/v2
name: localhost:5000
readonly: false
auth:
enabled: false
官方安装文档:https://docs.docker.com/compose/install/
安装:
curl -L --fail https://github.com/docker/compose/releases/download/1.14.0/run.sh > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
如果提示版本不匹配,docker最新版本安装
apt-get update
apt-get install -t wheezy-backports linux-image-amd64
curl -sSL https://get.docker.com/ | sh
docker-compose 命令
docker-compose up # 重新构建并在 Compose 中运行应用
docker-compose up -d # 后台启动
docker-compose stop # 停止
docker-compose down --volumes # 你可以停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除 Redis 容器中所使用的数据卷。
docker-compose其他标签:
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /app
domainname: malu.me
hostname: malu
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true
中文输入乱码,查看乱码解决
docker run env LANG=C.UTF-8
然后在docker启动文件.bashrc里加上
export LC_ALL=C.UTF-8