docker
apt默认源修改
备份默认源
cp /etc/apt/sources.list /etc/apt/sourses.list.bak
wsl2 ubuntu修改默认源
编辑文件vim /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
更新源
apt-get update
apt-get upgrade
安装docker
安装软件包以允许 apt 通过 HTTPS 使用存储库
apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
设置稳定的存储库
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
更新 apt 包索引
apt-get update
docker --version
sudo gpasswd -a 用户名 docker
docker镜像源修改
vim /etc/docker/daemon.json
添加以下内容
{
"registry-mirrors":["https://hub-mirror.c.163.com","https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"]
}
启动、停止与重启
sudo service docker start
sudo service docker stop
sudo service docker restart
镜像相关
查看镜像
docker images
搜索镜像
docker search 镜像名
下载
docker pull 镜像名
删除镜像
按镜像id删除
docker rmi 镜像id
删除所有镜像
docker rmi `docker images -q`
docker容器相关
查看容器
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
查看停止的容器
docker ps -f status=exited
创建与启动容器
创建容器命令:docker run
-i: 表示运行容器
-t: 表示启动后进入其命令行
--name: 为容器命名
-v: 表示目录的映射关系(宿主机目录:容器的目录)
-d: 创建一个守护式容器在后台运行
-p: 表示端口映射(宿主机端口:容器内的映射端口)
交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
守护式创建容器
docker run -di --name=容器名称 镜像名称:标签
登录守护式容器方式
docker exec -it 容器名称或容器id /bin/bash
启动和停止容器
docker start 容器名称或容器id docker stop 容器名称或容器id
将文件拷贝到容器
docker cp 要拷贝的文件或目录 容器名称:容器目录
将文件从容器拷贝出来
docker cp 要拷贝的容器名称:要拷贝的容器目录 本地目录
目录挂载
docker run -di -v 宿主机目录:容器目录 --name=自定义容器名 镜像名:tag
查看容器的ip地址
docker inspect 容器名称(容器id)
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名
删除容器
docker stop 容器名
docker rm 容器名
备份与迁移
保存为镜像
docker commit nginx mynginx
镜像备份,保存为tar
docker save -o mynginx.tar mynginx
恢复与迁移,加载tar文件
docker load -i mynginx.tar
Dockerfile
Dockerfile是一系列命令和参数构成的脚本,这些命令用于基础镜像并最终创建一个新的镜像。
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 |
RUN command | Dockerfile的核心部分 |
ADD source_dir/file dest_dir/file | 将宿主机文件复制到容器内,压缩文件自动解压 |
WORKDIR path_dir | 设置工作目录 |
以jdk8为例创建Dockerfile
mkdir -p /user/local/docker-jdk8
vi Dockerfile
以下为Dockerfile内容:
FROM ubuntu
MAINTAINER wsj0051
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk*.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
执行命令构建镜像
docker build -t='jdk1.8' .
Docker私有仓库
拉取私有仓库镜像
docker pull registry
启动私有仓库
docker run -di --name=registry -p 5000:5000 registry
浏览器输入地址http://ip:5000/v2/_catalog看到{"repositories":[]}表示私有仓库搭建成功并且内容为空
修改
/etc/docker/daemon.json
{"insecure-registries":["ip:5000"]}
将镜像上传到私有仓库
docker tag jdk1.8 ip:5000/jdk1.8 docker push ip:5000/jdk1.8
常用应用安装
tomcat
docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
nginx
docker run -d -p 80:80 --name nginx --restart unless-stopped nginx
将本地的html文件夹复制到nginx下
docker cp html nginx:/usr/share/nginx/
redis
docker run -di --name=myredis -p 5379:6379 redis
安装Portainer-CE中文版
Portainer-CE是docker的图形化管理面板,提供一个后台页面方便操作docker。
终端输入命令,一键安装Portainer-CE中文版;
docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce:linux-arm64
code-server
docker run -d --restart always --name code-server -p 8090:8080 \
-v /usr/local/src/appdata/code-server/config:/home/coder/.config \
-v /home/pi/wsj0051:/home/coder/project \
-u "$(id -u):$(id -g)" \
-e "DOCKER_USER=$USER" \
-e PASSWORD=******** \
codercom/code-server:latest
php-env肥羊
docker run -d --restart unless-stopped \
--privileged=true -p 5678:80 \
--name php-env \
-v /usr/local/src/appdata/php-env:/var/www/html \
youshandefeiyang/php-env:arm64
ubuntu
docker run --restart=unless-stopped -d \
--dns=172.17.0.1 -u=0:0 --shm-size=512m \
-p 6901:6901 -e VNC_PW=password \
-e VNC_USE_HTTP=0 -e TZ=Asia/Shanghai \
-v /mnt:/mnt:rslave \
--name ubuntu \
"linkease/desktop-ubuntu-standard-arm64:latest"
xteve
docker run -d \
--restart unless-stopped \
--name=xteve_guide2go \
--net=host \
--log-opt max-size=10m \
--log-opt max-file=3 \
-e TZ="Asia/Shanghai" \
-v /usr/local/src/appdata/xteve/:/root/.xteve:rw \
-v /usr/local/src/appdata/xteve/_config/:/config:rw \
-v /usr/local/src/appdata/xteve/_guide2go/:/guide2go:rw \
-v /tmp/xteve/:/tmp/xteve:rw \
-v /usr/local/src/appdata/tvheadend/data/:/TVH \
jjm2473/xteve_guide2go
aria2
docker run -d \
--name aria2-pro \
--restart unless-stopped \
--log-opt max-size=1m \
-e PUID=$UID \
-e PGID=$GID \
-e UMASK_SET=022 \
-e RPC_SECRET=XXXXXX \
-e RPC_PORT=6800 \
-e IPV6_MODE=true \
-p 6800:6800 \
-e LISTEN_PORT=6888 \
-p 6888:6888 \
-p 6888:6888/udp \
-v /usr/local/src/appdata/aria2/aria2-config:/config \
-v /mnt/sda1/Public/Downloads:/downloads \
p3terx/aria2-pro
aria2 webUi控制台
# bridge 网络模式
docker run -d \
--name ariang \
--restart unless-stopped \
--log-opt max-size=1m \
-p 6880:6880 \
p3terx/ariang
# host 网络模式(如果你需要使用 IPv6 网络访问,这是最简单的方式)
docker run -d \
--name ariang \
--log-opt max-size=1m \
--restart unless-stopped \
--network host \
p3terx/ariang --port 6880 --ipv6
安装nextcloud
使用mariadb
- 先安装数据库mariadb:Docker拉取mariadb镜像并创建容器,进入终端,输入下面的命令并回车运行(先别直接复制输入,下方有说明);
docker run -d --name mariadb \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=****** \ -v /usr/local/src/appdata/mariadb:/var/lib/mysql \ --restart unless-stopped \ mariadb:10.5.12
- 说明:
MYSQL_ROOT_PASSWORD=123456
设置数据库root
账户密码,设置为123456
,按需修改。3344:3306
将mariadb
数据库的3306
端口映射为3344
,按需修改- 连接命令同mysql
mysql -u root -p
- 说明:
- 再安装Nextcloud:Docker拉取nextcloud镜像并创建容器,进入终端,输入下面的命令并回车运行(先别直接复制输入,下方有说明);
docker run -d --name nextcloud \ -p 3333:80 \ -v /usr/local/src/appdata/nextcloud/html:/var/www/html \ -v /usr/local/src/appdata/nextcloud/data:/var/www/html/data \ -v /usr/local/src/appdata/nextcloud/apps:/var/www/html/custom_apps \ -v /usr/local/src/appdata/nextcloud/config:/var/www/html/config \ --restart unless-stopped \ nextcloud
- 说明:
/usr/local/src/appdata/nextcloud/html
Nextcloud主文件夹的映射目录,按需修改。/usr/local/src/appdata/nextcloud/data
实际数据的映射目录,按需修改。/usr/local/src/appdata/nextcloud/apps
安装/修改的应用程序的映射目录,按需修改。/usr/local/src/appdata/nextcloud/config
本地配置文件的映射目录,按需修改。3333:80
将nextcloud的访问端口映射为3333,按需修改。
- 说明:
使用mysql
# mysql
docker run -d --name mysql \
-v /usr/local/src/appdata/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=****** \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=****** \
-p 3307:3306 \
--restart=always \
-d mysql/mysql-server
-e
代表添加环境变量MYSQL_ROOT_PASSWORD
是root用户的登录密码- 进入mysql容器,并登陆mysql
docker exec -it mysql bash mysql -u root -p
- 创建用户,赋予权限
Create user 'nextcloud'@'%' identified by '*******'; grant all privileges on nextcloud.* to 'nextcloud'@'%';
开启远程访问权限
use mysql; select host,user from user; alter user 'root'@'%' identified with mysql_native_password by '******'; flush privileges;
开机启动
sudo docker update mysql --restart=always
树莓派64位系统安装nextcloud
docker run -d --name nextcloud \
-v /usr/local/src/appdata/nextcloud/data:/var/www/html \
--link mysql:mysql \
--restart=always \
--privileged=true \
-p 8888:80 arm64v8/nextcloud
- 修改配置文件
mkdir /data/nextcloud/config sudo docker cp nextcloud:/var/www/html/config/config.sample.php /data/nextcloud/config/config.sample.php sudo docker cp /data/nextcloud/config/config.php nextcloud:/var/www/html/config/config.php nano /data/nextcloud/config/config.sample.php
- 修改
trusted_domains
里的值1 => preg_match('/cli/i',php_sapi_name())?'127.0.0.1':$_SERVER['SERVER_NAME']
- 安装nextcloud客户端
apt install nextcloud-desktop-l10n nextcloud-desktop -y
安装迅雷
默认端口2345
docker run -d --name=xunlei --hostname=mynas --net=host \
-v /usr/local/src/appdata/xunlei:/xunlei/data \
-v /mnt/sda1/media/Movies:/xunlei/nas \
-v /mnt/sda1/Public/Downloads:/xunlei/downloads \
--restart=unless-stopped \
--privileged \
registry.cn-shenzhen.aliyuncs.com/cnk3x/xunlei:latest
安装alist
docker run -d --restart=always \
-v /usr/local/src/appdata/alist:/opt/alist/data \
-v /mnt/sda1:/opt/alist/mnt \
-p 5244:5244 \
-e PUID=0 -e PGID=0 \
-e UMASK=022 \
--name="alist" \
xhofe/alist:latest
安装后查看密码
docker exec -it alist ./alist admin
photoprism私人相册
docker run -d --name photoprism \
-e PHOTOPRISM_ADMIN_PASSWORD=******* \
-p 2342:2342 \
-v /usr/local/src/appdata/photoprism:/photoprism/storage \
-v /mnt/sda1/media/Photos:/photoprism/originals \
--restart unless-stopped \
photoprism/photoprism
emby
docker run \
--network=bridge \
-p '8097:8096' \
-v /usr/local/src/appdata/emby:/config \
-v /mnt/sda1/media/:/data \
-e TZ="Asia/Shanghai" \
--device /dev/dri:/dev/dri \
-e UID=0 \
-e GID=0 \
-e GIDLIST=0 \
--restart always \
--name emby \
-d lovechen/embyserver:latest
1900
与xteve端口冲突8920
,7359
与jellyfin冲突
jackett
docker run -d \
--name=jackett \
-e PUID=0 \
-e PGID=0 \
-e TZ=Asia/Shanghai \
-e AUTO_UPDATE=true `#optional` \
-p 9117:9117 \
-v /usr/local/src/appdata/jacket:/config \
--restart unless-stopped \
linuxserver/jackett:latest
qbittorrent
docker run -d \
--name=qbittorrent \
-e PUID=$UID \
-e PGID=$GID \
-e TZ=Asia/Shanghai \
-e WEBUI_PORT=8081 \
-p 6881:6881 \
-p 6881:6881/udp \
-p 8081:8081 \
-v /usr/local/src/appdata/qbittorrent/config:/etc/qBittorrent \
-v /mnt/sda1/Public/Downloads:/downloads \
--restart unless-stopped \
linuxserver/qbittorrent:latest
jellyfin
docker run -d --name=jellyfin -p 8096:8096 \
-p 8920:8920 -p 7359:7359/udp \
-v /usr/local/src/appdata/jellyfin/config:/config \
-v /mnt/sda1/media:/media \
-v /mnt/sda1/cache:/cache \
-e TZ=Asia/Shanghai -e PUID=0 -e PGID=0 \
--device=/dev/dri:/dev/dri \
--restart unless-stopped \
--add-host=api.themoviedb.org:13.224.161.90 \
--add-host=api.themoviedb.org:13.35.8.65 \
--add-host=api.themoviedb.org:13.35.8.93 \
--add-host=api.themoviedb.org:13.35.8.6 \
--add-host=api.themoviedb.org:13.35.8.54 \
--add-host=image.tmdb.org:138.199.37.230 \
--add-host=image.tmdb.org:108.138.246.49 \
--add-host=api.thetvdb.org:13.225.89.239 \
--add-host=api.thetvdb.org:192.241.234.54 \
jellyfin/jellyfin:latest
说明:
--add-host
为容器增加 host 指向,加速海报与影视元数据的搜刮 也可以在容器控制台输入:echo 13.224.161.90 api.themoviedb.org >> /etc/hosts echo 104.16.61.155 image.themoviedb.org >> /etc/hosts echo 13.35.67.86 api.themoviedb.org >> /etc/hosts echo 54.192.151.79 www.themoviedb.org >> /etc/hosts echo 13.225.89.239 api.thetvdb.com >> /etc/hosts echo 13.249.175.212 api.thetvdb.com >> /etc/hosts echo 13.35.161.120 api.thetvdb.com >> /etc/hosts echo 13.226.238.76 api.themoviedb.org >> /etc/hosts echo 13.35.7.102 api.themoviedb.org >> /etc/hosts echo 13.225.103.26 api.themoviedb.org >> /etc/hosts echo 13.226.191.85 api.themoviedb.org >> /etc/hosts echo 13.225.103.110 api.themoviedb.org >> /etc/hosts echo 52.85.79.89 api.themoviedb.org >> /etc/hosts echo 13.225.41.40 api.themoviedb.org >> /etc/hosts echo 13.226.251.88 api.themoviedb.org >> /etc/hosts echo 185.199.111.133 raw.github.com >> /etc/hosts echo 185.199.111.133 raw.githubusercontent.com >> /etc/hosts echo 140.82.114.4 github.com >> /etc/hosts
- 如果使用
linuxserver/jellyfin
镜像,就把最后一行替换为下行lscr.io/linuxserver/jellyfin:latest
- 如果使用
nyanmisaka/jellyfin
镜像,最把最后一行替换为下行nyanmisaka/jellyfin:latest
#arm不支持 - 下载字体改名后,字体替换
docker cp DejaVuSans-Bold.ttf jellyfin:/usr/share/fonts/truetype/dejavu/ docker cp DejaVuSansMono-Bold.ttf jellyfin:/usr/share/fonts/truetype/dejavu/ docker cp DejaVuSansMono.ttf jellyfin:/usr/share/fonts/truetype/dejavu/ docker cp DejaVuSans.ttf jellyfin:/usr/share/fonts/truetype/dejavu/ docker cp DejaVuSerif.ttf jellyfin:/usr/share/fonts/truetype/dejavu/ docker cp DejaVuSerif-Bold.ttf jellyfin:/usr/share/fonts/truetype/dejavu/
设置代理
Docker 代理
在执行docker pull时,是由守护进程dockerd来执行。因此,代理需要配在dockerd的环境中。而这个环境,则是受systemd所管控,因此实际是systemd的配置。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
其中,proxy.example.com:8080 要换成可用的免密代理。通常使用 cntlm 在本机自建免密代理,去对接公司的代理。可参考《Linux下安装配置Cntlm 代理》。
Container 代理
在容器运行阶段,如果需要代理上网,则需要配置 ~/.docker/config.json。以下配置,只在Docker 17.07及以上版本生效。
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}
这个是用户级的配置,除了 proxies,docker login 等相关信息也会在其中。而且还可以配置信息展示的格式、插件参数等。
此外,容器的网络代理,也可以直接在其运行时通过 -e 注入 http_proxy 等环境变量。这两种方法分别适合不同场景。config.json 非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用 -e 注入这种显式配置会更好,减轻对构建、部署环境的依赖。当然,在这些环境中,最好用良好的设计避免配置代理上网。
Docker Build 代理
虽然 docker build 的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。在构建时,需要注入 http_proxy 等参数。
docker build . \
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag
- 注意:
- 无论是 docker run 还是 docker build,默认是网络隔绝的。如果代理使用的是 localhost:3128 这类,则会无效。这类仅限本地的代理,必须加上 --network host 才能正常使用。而一般则需要配置代理的外部IP,而且代理本身要开启 Gateway 模式。
- docker build 代理是在执行前设置的,所以修改后,下次执行立即生效。Container 代理的修改也是立即生效的,但是只针对以后启动的 Container,对已经启动的 Container 无效。
重启生效配置
dockerd 代理的修改比较特殊,它实际上是改 systemd 的配置,因此需要重载 systemd 并重启 dockerd 才能生效。
sudo systemctl daemon-reload
sudo systemctl restart docker