一、docker常用命令
1、安装命令
sudo apt install docker.io
2、镜像管理
# 查看本地所有镜像
docker images
# 移除指定镜像
docker image rm <image_name>:<tag>/<image_id>
# 其他命令
# dockerhub(https://hub.docker.com/)实在是太慢了
# 创建容器使用本地不存在的镜像时,默认会从dockerhub拉取
docker pull
docker commit
docker tag
docker login
docker push
3、容器管理
# 查看当前运行docker容器
docker ps
# 查看环境中的所有docker容器
docker ps -a
# 指定image创建后台运行容器,进程1为:/bin/bash
docker run -itd --name <container_name> <image_name>:<tag> /bin/bash
# 启动/停止/进入容器
docker start <container_name/id>
docker stop <container_name/id>
docker attach <container_name/id>
# 指定运行容器中的进程
# 使用attach进入容器退出默认会停止容器,可以使用exec运行/bin/bash创建新的交互终端
docker exec -it <container_name/id> /bin/bash
#移除指定容器
docker rm <container_name/id>
# 将本地文件cp到容器内
docker cp <file_local_path> <containe_name/id>:<file_docker_path>
# 将容器内的文件cp到本地
docker cp <containe_name/id>:<file_docker_path> <file_local_path>
4、本地镜像分享
# 从容器导出镜像文件(当前运行容器的快照)
docker export <container_id/name> > <image_name>.tar
# 将镜像文件导入本地
docker import <image_name>.tar <image_name>:<image_tag>
# 将本地镜像导出(包含image的所有数据层,常用于迁移或备份image)
docker save -o <image_name>.tar <image_id/name>
# 将镜像文件导入到本地(不可重命名)
docker load -i <image_name>.tar
5、docker run&exec 常用参数
- docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Create and run a new container from an image
Aliases:
docker container run, docker run
Options:
...
-d, --detach Run container in background and print container ID
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
...
-h, --hostname string Container host name
-i, --interactive Keep STDIN open even if not attached
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
...
--name string Assign a name to the container
...
# 参数格式: -p <host_port>:<container_port>
-p, --publish list Publish a container's port(s) to the host
...
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
...
# 参数格式: -v <host_dir>:<container_dir>
-v, --volume list Bind mount a volume
...
-w, --workdir string Working directory inside the container
- docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Execute a command in a running container
Aliases:
docker container exec, docker exec
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: "<name|uid>[:<group|gid>]")
-w, --workdir string Working directory inside the container
二、Docker高级操作
1、取消docker的sudo权限
(1)将当前用户添加到docker组
sudo gpasswd -a ${USER} docker
(2)更新docker group
newgrp docker
(3)测试验证
docker version
2、使能IPv6网络
(1)vim /etc/docker/daemon.json
{
"experimental": true,
"ipv6": true,
"ip6tables": true,
"fixed-cidr-v6": "2000::/3"
}
(2)重启docker
sudo systemctl restart docker
3、修改镜像源
(1)vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub.docker.com",
"https://registry.docker-cn.com",
"https://hub.atomgit.com/",
"other mirror image source"
]
}
(2)重启docker
sudo systemctl restart docker
4、在docker容器内使用systemd
(1)指定image创建容器
docker run -it --name <container_name> --privileged <image_name>:<tag> /bin/bash
(2)更新软件源,部署systemd
# 更新软件源
apt update
# 更新软件
apt upgrade
# 安装systemd
apt install systemd
ln -s /lib/systemd/systemd /usr/sbin/init
# 也可以同时安装其他所需软件
# ...
安装完成后,在container内执行"exit"退出容器。
若需要docker容器支持systemd,需要将/usr/sbin/init设置为1号进程(默认为/bin/bash),因此我们需要将这个容器打包为新的镜像,基于新的镜像再创建支持systemd的新容器。
(3)将当前容器保存为新镜像
docker commit -a "<author>" -m "<commit_info>" <container_name> <image>:<tag>
(4)创建使用支持systemd的容器
# 创建容器
docker run -itd --name <container_name> --privileged <image_with_systemd_name>:<tag> /usr/sbin/init
# 进入容器
docker exec -it <container_name> /bin/bash
5、固定docker容器ip地址
当创建docker容器时固定ip地址,需要创建自定义网络,docker安装后配置的默认网络不支持设置静态ip。
当我们使用安装后默认的网络(比如bridge)设置静态ip时,会看到以下报错:
dev@ubuntu: docker run -it --ip 172.18.0.2 --network bridge --name network_test ubuntu:latest
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
ERRO[0000] error waiting for container:
我们可以使用docker network命令创建自定义网络,用于创建固定ip的容器(实测支持IPv4/IPv6的静态IP设置)。
(1)docker network工具
# 查看命令帮忙
docker network --help
# 查看已存在网络
docker network ls
# 创建自定义网络
docker network create <network_name>
# 移除指定网络
docker network rm <network_name>
# 查看网络的详细信息
docker network inspect <network_name>
(2)创建自定义网络
- IPv4网络
docker network create --subnet=<ipv4_subnet_addr> <network_name>
- IPv6网络
docker network create --subnet=<ipv6_subnet_addr> --ipv6 <network_name>
注:创建的默认虚拟网卡名为br-<network-hash>, 可以添加"-o com.docker.network.bridge.name=<br_name>"参数指定虚拟网卡名。
(3)指定网络和IP地址创建容器
- IPv4网络
docker run -itd --ip <ipv4_address> --network <network_name> --name <container_name> <image_name>:<tag>
- IPv6网络
docker run -itd --ip6 <ipv6_address> --network <network_name> --name <container_name> <image_name>:<tag>
此时创建的容器已被设置为指定ip地址,可以进入容器查看确认。
多个容器使用相同自定义网络时,彼此间默认可以通信。如果我们希望不同自定义网络下的容器可以实现通信,我们可以借linux下iptables命令配置流量转发。
(1)增加experimental和iptables/ip6tables配置项
# vim /etc/docker/daemon.json
{
"experimental": true,
"iptables": true,
"ip6tables": true,
}
(2)配置流量转发规则
# 允许net1_name --> net2_name的流量转发
sudo ip6tables -I DOCKER-USER -i <net1_name> -o <net2_name> -j ACCEPT
# 允许net2_name --> net1_name的流量转发
sudo ip6tables -I DOCKER-USER -i <net2_name> -o <net1_name> -j ACCEPT