I was recently configuring Docker on a machine that didn’t have direct access to the Internet and had to use proxy for outbound connectivity, and it turned out to be a non-trivial task. All of this info is scattered around the Internet, I’m just bringing it all together. Here’s the steps to get everything working:
- Proxy for the command line
- Proxy for
apt
- Proxy for Docker daemon
- Proxy for Docker build and Docker Compose
This article has been written for Ubuntu Linux and might need tweaking for other distros.
Proxy for the command line
This part is as easy as setting the following environment variables (https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-configure-proxy-on-ubuntu-18-04/):
http_proxy, HTTP_PROXY
— proxy server for HTTP Traffichttps_proxy, HTTPS_PROXY
— proxy server for HTTPS trafficftp_proxy, FTP_PROXY
— proxy server for FTP trafficno_proxy, NO_PROXY
— comma separated patterns for IP addresses or domain names that shouldn’t use the proxy. It is a good idea to add at leastlocalhost
and127.0.0.1
to noproxy list.
Set these once for the active session, add them to ~/.bash_profile
or ~/.bashrc
for persistent settings for current user, or add them to /etc/environment
for persistent settings for all users. It turns out that different tools use different versions of these variables (lowercase vs uppercase), so it’s best so set both versions (see https://wiki.archlinux.org/index.php/Proxy_server#Environment_variables for more info).
Proxy for apt
Create a new apt configuration file under /etc/apt/apt.conf.d
, the name of the new configuration file doesn’t matter much, it’s a good idea to pick something obvious like 50proxy
(alternatively, you can edit /etc/apt.conf
directly). Add the following lines to the new configuration file (replace proxy.server
and port
with appropriate values):
Acquire::http::Proxy "http://proxy.server:port";
Acquire::https::Proxy "http://proxy.server:port";
Proxy for Docker daemon
When using Docker, actions like pulling images are performed by the Docker daemon and do not use your shell’s environment variables. To configure proxy settings for the Docker daemon:
Create directory /etc/systemd/system/docker.service.d
for Docker proxy settings config file. Then create /etc/systemd/system/docker.service.d/http-proxy.conf
with the following contents (replace proxy.server
and port
):
[Service]
Environment="HTTP_PROXY=http://proxy.server:port"
Environment="HTTPS_PROXY=http://proxy.server:port"
Environment="NO_PROXY=localhost,127.0.0.1"
Apply settings and restart Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
(Check the settings using systemctl show --property=Environment docker
).
More info: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
Proxy for Docker build and Docker Compose
If you’re building Docker images with docker build
or docker-compose
, you will want to configure proxy settings for the build process. Despite the fact that Docker daemon has the correct proxy settings, during the build process commands that update the image being built (i.e. apk update
, apt-get update
etc.) will fail without this step.
For the user that will be building images, create ~/.docker/config.json
with the following contents (replace proxy.server
and port
):
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy.server:port",
"httpsProxy": "http://proxy.server:port",
"noProxy": "localhost,127.0.0.1"
}
}
}
More info: https://docs.docker.com/network/proxy/